使用PHP对图片上传生成等比缩小的缩略图会旋转

现象

用相机拍摄的图片,预览正常,上传到站点显示也正常,但是生成缩略图会被旋转。

原因

这种情况是因为生成缩略图用到的getimagesize方法将宽度和高度取反了,取反的原因是图片含有EXIF信息方向为旋转 90 度

比如原图:

file

getimagesize 方法获取的结果

file

检查原图 EXIF

file

解决办法

开启 EXIF 扩展,从图片文件中读取 EXIF 头信息

重新计算宽度和高度,并将原图旋转还原

$org_info = @getimagesize($img);
$img_org = $this->img_resource($img, $org_info[2]);
$exif = @exif_read_data($img);
if (isset($exif['Orientation'])){
    $exif_org_info = array();
    switch ($exif['Orientation'])
    {
        // -90 degrees rotation
        case 6:
            $img_org = imagerotate($img_org, -90, 0);
            $exif_org_info = array($org_info[1], $org_info[0]);
            break;
        case 8:
            // 90 degrees rotation
            $img_org = imagerotate($img_org, 90, 0);
            $exif_org_info = array($org_info[1], $org_info[0]);
            break;
        case 3:
            // 180 rotation
            //$exif_org_info  = array($org_info[0], $org_info[1]);
            break;
    }

    //重新赋值
    if (isset($exif_org_info[0]) && $exif_org_info[0])
    {
        $org_info[0] = $exif_org_info[0];
        $org_info[1] = $exif_org_info[1];
    }
}

后续

用 $org_info 计算好缩略图的宽高,拿 $img_org 作为缩略图的源图象资源,生成缩略图。

发表评论