Подпираем костылём EXIF

Школьная задачка.
Дано: есть вертикальная фотка в горизонтальном файле размером 2016х1512 и метаданными EXIF, куда её вращать.
Поведение: phpthumb фотку послушно поворачивает, но вот обрезку делает по исходному горизонтальному формату.
Найти: смысл жизни в форме правильно обрезанной фотки.

В исходниках phpthumb и премудростях $this->source_width, $this->source_height я не разобрался, поэтому решил задачу двухколесным другом — поворачиваю исходную фотку согласно EXIF перед тем как она попадет в phpthumb.

Создал плагин на событие OnFileManagerFileCreate:

<?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. если у кого-то появился азарт пофиксить и сделать правильно — делитесь решением ;)
tolanych
29 января 2019, 21:25
3
282
+5

Комментарии: 2

vectorserver
30 января 2019, 09:05
+1
Обычно пользуюсь через 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
Pavel Zarubin
31 января 2019, 03:45
0
Ого, когда то оооочень давно сталкивался с такой проблемой, я думал у меня глюки когда горизонтальную фотку выводил вертикально) Теперь хоть буду знать в чем веселье было)