Подпираем костылём EXIF
Школьная задачка.
Дано: есть вертикальная фотка в горизонтальном файле размером 2016х1512 и метаданными EXIF, куда её вращать.
Поведение: phpthumb фотку послушно поворачивает, но вот обрезку делает по исходному горизонтальному формату.
Найти: смысл жизни в форме правильно обрезанной фотки.
В исходниках phpthumb и премудростях $this->source_width, $this->source_height я не разобрался, поэтому решил задачу двухколесным другом — поворачиваю исходную фотку согласно EXIF перед тем как она попадет в phpthumb.
Создал плагин на событие OnFileManagerFileCreate:
Дано: есть вертикальная фотка в горизонтальном файле размером 2016х1512 и метаданными EXIF, куда её вращать.
Поведение: phpthumb фотку послушно поворачивает, но вот обрезку делает по исходному горизонтальному формату.
Найти: смысл жизни в форме правильно обрезанной фотки.
В исходниках phpthumb и премудростях $this->source_width, $this->source_height я не разобрался, поэтому решил задачу двухколесным другом — поворачиваю исходную фотку согласно EXIF перед тем как она попадет в phpthumb.
<?php
if (file_exists($path) && exif_imagetype($path) == IMAGETYPE_JPEG) {
if ($exif_data = @exif_read_data($path, 'IFD0')) {
switch (@$exif_data['Orientation']) {
case 6:
$rotate_angle = 270;
break;
case 8:
$rotate_angle = 90;
break;
}
}
if (!empty($rotate_angle)) {
$gd = imagecreatefromjpeg($path);
$rotate = imagerotate($gd, $rotate_angle, 0);
imagejpeg($rotate,$path,100);
}
}
p.s. если у кого-то появился азарт пофиксить и сделать правильно — делитесь решением ;)
Поблагодарить автора
Отправить деньги
Комментарии: 2
Обычно пользуюсь через getImageOrientation пример:
Функция:
Функция:
<?php
// Note: $image is an Imagick object, not a filename! See example use below.
function autoRotateImage($image) {
$orientation = $image->getImageOrientation();
switch($orientation) {
case imagick::ORIENTATION_BOTTOMRIGHT:
$image->rotateimage("#000", 180); // rotate 180 degrees
break;
case imagick::ORIENTATION_RIGHTTOP:
$image->rotateimage("#000", 90); // rotate 90 degrees CW
break;
case imagick::ORIENTATION_LEFTBOTTOM:
$image->rotateimage("#000", -90); // rotate 90 degrees CCW
break;
}
// Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image!
$image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
}
?>
Обработка:<?php
$image = new Imagick('my-image-file.jpg');
autoRotateImage($image);
// - Do other stuff to the image here -
$image->writeImage('result-image.jpg');
?>
Источник: php.net/manual/en/imagick.getimageorientation.php
Ого, когда то оооочень давно сталкивался с такой проблемой, я думал у меня глюки когда горизонтальную фотку выводил вертикально) Теперь хоть буду знать в чем веселье было)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.