Получить ориентацию мобильного изображения в PHP [duplicate]

61
задан Marc B 20 September 2011 в 20:10
поделиться

9 ответов

Документация для imagerotate относится к другому типу для первого параметра, чем вы используете:

Ресурс изображения, возвращенный одной из функций создания изображения, например, imagecreatetruecolor ().

Вот небольшой пример использования этой функции:

function resample($jpgFile, $thumbFile, $width, $orientation) {
    // Get new dimensions
    list($width_orig, $height_orig) = getimagesize($jpgFile);
    $height = (int) (($width / $width_orig) * $height_orig);
    // Resample
    $image_p = imagecreatetruecolor($width, $height);
    $image   = imagecreatefromjpeg($jpgFile);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
    // Fix Orientation
    switch($orientation) {
        case 3:
            $image_p = imagerotate($image_p, 180, 0);
            break;
        case 6:
            $image_p = imagerotate($image_p, -90, 0);
            break;
        case 8:
            $image_p = imagerotate($image_p, 90, 0);
            break;
    }
    // Output
    imagejpeg($image_p, $thumbFile, 90);
}
57
ответ дан Daniel Bleisteiner 26 August 2018 в 20:14
поделиться

Мне не нравится перекликаться с еще одним набором значений ориентации, но, по моему опыту, используя любое из значений, перечисленных выше, я всегда получал перевернутые изображения при загрузке портретных снимков ориентации непосредственно с iPhone. Вот оператор switch, с которым я закончил.

switch ($exif['Orientation']) {
        case 3:
            $image = imagerotate($image, -180, 0);
            break;

        case 6:
            $image = imagerotate($image, -90, 0);
            break;

        case 8:
            $image = imagerotate($image, 90, 0);
            break;
    }
1
ответ дан Brad Root 26 August 2018 в 20:14
поделиться

Возможно, стоит упомянуть, что если вы используете ImageMagick из командной строки, вы можете использовать опцию -auto-orient , которая автоматически поворачивает изображение на основе существующих данных ориентации EXIF.

convert -auto-orient /tmp/uploadedImage.jpg /save/to/path/image.jpg

Обратите внимание: если данные EXIF ​​были удалены перед процессом, они не будут работать, как описано.

5
ответ дан Cat 26 August 2018 в 20:14
поделиться

Изображение вмешательства имеет метод orientate() .

$img = Image::make('foo.jpg')->orientate();
0
ответ дан Damien Ó Ceallaigh 26 August 2018 в 20:14
поделиться

На всякий случай кто-то сталкивается с этим. Из того, что я могу сделать, некоторые из приведенных выше операторов переключения неверны.

На основе информации здесь это должно быть:

switch ($exif['Orientation']) {
    case 3:
        $image = imagerotate($image, -180, 0);
        break;
    case 6:
        $image = imagerotate($image, 90, 0);
        break;
    case 8:
        $image = imagerotate($image, -90, 0);
        break;
} 
4
ответ дан Dukeling 26 August 2018 в 20:14
поделиться

jhead -autorot jpegfile.jpg

Также полезный способ приблизиться к этому.

jhead - стандартная программа в Linux (используйте 'sudo apt-get install jhead' для install), эта опция смотрит на ориентацию и правильно поворачивает изображение и без потерь, только если это требуется. Затем он также правильно обновляет данные EXIF.

Таким образом вы можете обрабатывать jpeg (или несколько jpegs в папке) простым одноразовым способом, который постоянно фиксирует проблемы с ротацией.

Например: jhead -autorot * .jpg исправит целую папку jpeg-изображений только так, как требует OP в начальном вопросе.

Хотя это не технический PHP, я прочитал этот поток, а затем использовал вместо моего вызова jhead, вызванного из вызова PHP system () для достижения результатов, которые были после этого совпали с OP: для поворота изображений, чтобы любое программное обеспечение (например, «fbi» в Raspbian) отображало их правильно.

В свете этого я думал, что другие могут извлечь выгоду из знания того, как легко jhead решает эту проблему и размещает информацию здесь только в информационных целях, потому что никто ранее не упоминал об этом.

-1
ответ дан G.P.W. 26 August 2018 в 20:14
поделиться

Основываясь на коде Дэниела, я написал функцию, которая просто поворачивает изображение, если это необходимо, без повторной выборки.

GD

function image_fix_orientation(&$image, $filename) {
    $exif = exif_read_data($filename);

    if (!empty($exif['Orientation'])) {
        switch ($exif['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }
    }
}

Версия одной строки (GD)

function image_fix_orientation(&$image, $filename) {
    $image = imagerotate($image, array_values([0, 0, 0, 180, 0, 0, -90, 0, 90])[@exif_read_data($filename)['Orientation'] ?: 0], 0);
}

ImageMagick

function image_fix_orientation($image) {
    if (method_exists($image, 'getImageProperty')) {
        $orientation = $image->getImageProperty('exif:Orientation');
    } else {
        $filename = $image->getImageFilename();

        if (empty($filename)) {
            $filename = 'data://image/jpeg;base64,' . base64_encode($image->getImageBlob());
        }

        $exif = exif_read_data($filename);
        $orientation = isset($exif['Orientation']) ? $exif['Orientation'] : null;
    }

    if (!empty($orientation)) {
        switch ($orientation) {
            case 3:
                $image->rotateImage('#000000', 180);
                break;

            case 6:
                $image->rotateImage('#000000', 90);
                break;

            case 8:
                $image->rotateImage('#000000', -90);
                break;
        }
    }
}
64
ответ дан Jonathan 26 August 2018 в 20:14
поделиться

Здесь я объясняю все это, я использую Laravel и использую пакет Imaging Imaging.

Прежде всего, я получаю свое изображение и отправляю его другой функции для изменения размера и некоторых других функций , если нам это не нужно, вы можете пропустить ...

Возьмите файл с помощью метода в моем контроллере,

 public  function getImageFile(Request $request){
    $image = $request->image;
    $this->imageUpload($image);
}

Теперь я отправляю его для изменения размера и получения имя изображения и расширение ...

public function  imageUpload($file){
    ini_set('memory_limit', '-1');
    $directory = 'uploads/';
    $name = str_replace([" ", "."], "_", $file->getClientOriginalName()) . "_";
    $file_name = $name . time() . rand(1111, 9999) . '.' . $file->getClientOriginalExtension();
    //path set
    $img_url = $directory.$file_name;
    list($width, $height) = getimagesize($file);
    $h = ($height/$width)*600;
    Image::make($file)->resize(600, $h)->save(public_path($img_url));
    $this->image_fix_orientation($file,$img_url);
    return $img_url;
}

Теперь я вызываю свою функцию ориентации изображения,

 public function image_fix_orientation($file,$img_url ) {
    $data = Image::make($file)->exif();
    if (!empty($data['Orientation'])) {
        $image = imagecreatefromjpeg($file);
        switch ($data['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }

        imagejpeg($image, $img_url, 90);
    }

}

И это все ...

1
ответ дан MD. ABU TALHA 26 August 2018 в 20:14
поделиться

Упрощенная функция для тех, кто загружает изображение, он просто авторотирует, если необходимо.

function image_fix_orientation($filename) {
    $exif = exif_read_data($filename);
    if (!empty($exif['Orientation'])) {
        $image = imagecreatefromjpeg($filename);
        switch ($exif['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }

        imagejpeg($image, $filename, 90);
    }
}
36
ответ дан turibe 26 August 2018 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: