为了账号安全,请及时绑定邮箱和手机立即绑定

PHP read_exif_data和调整方向

PHP read_exif_data和调整方向

PHP
largeQ 2019-11-25 14:53:50
如果方向关闭,我正在使用以下代码旋转上载的jpeg图像。从iPhone和Android上传的图像只有问题。if(move_uploaded_file($_FILES['photo']['tmp_name'], $upload_path . $newfilename)){            chmod($upload_path . $newfilename, 0755);            $exif = exif_read_data($upload_path . $newfilename);            $ort = $exif['IFD0']['Orientation'];            switch($ort)            {                case 3: // 180 rotate left                    $image->imagerotate($upload_path . $newfilename, 180, -1);                    break;                case 6: // 90 rotate right                    $image->imagerotate($upload_path . $newfilename, -90, -1);                    break;                case 8:    // 90 rotate left                    $image->imagerotate($upload_path . $newfilename, 90, -1);                    break;            }            imagejpeg($image, $upload_path . $newfilename, 100);            $success_message = 'Photo Successfully Uploaded';        }else{            $error_count++;            $error_message = 'Error: Upload Unsuccessful<br />Please Try Again';        }我从jpeg读取EXIF数据的方式有问题吗?它没有像预期的那样旋转图像。这是我运行var_dump($ exif)时发生的情况;array(41) {    ["FileName"]=> string(36) "126e7c0efcac2b76b3320e6187d03cfd.JPG"    ["FileDateTime"]=> int(1316545667)    ["FileSize"]=> int(1312472)    ["FileType"]=> int(2)    ["MimeType"]=> string(10) "image/jpeg"    ["SectionsFound"]=> string(30) "ANY_TAG, IFD0, THUMBNAIL, EXIF"    ["COMPUTED"]=> array(8) {        ["html"]=> string(26) "width="2048" height="1536""        ["Height"]=> int(1536)        ["Width"]=> int(2048)        ["IsColor"]=> int(1)        ["ByteOrderMotorola"]=> int(1)        ["ApertureFNumber"]=> string(5) "f/2.8"        ["Thumbnail.FileType"]=> int(2)        ["Thumbnail.MimeType"]=> string(10) "image/jpeg" }        ["Make"]=> string(5) "Apple"        ["Model"]=> string(10) "iPhone 3GS"        ["Orientation"]=> int(6)        ["XResolution"]=> string(4) "72/1"
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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);

}


查看完整回答
反对 回复 2019-11-25
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

根据丹尼尔(Daniel)的代码,我编写了一个函数,该函数仅在必要时旋转图像,而无需重新采样。


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);

}

图像魔术

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;

        }

    }

}


查看完整回答
反对 回复 2019-11-25
?
森栏

TA贡献1810条经验 获得超5个赞

对于上传图像的人来说,功能更简单,它会在必要时自动旋转。


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);

    }

}


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 593 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信