手机拍照上传的文件有时候方向会变,文件EXIF信息引起的,有的浏览器不支持解析EXIF就会出现问题,包括一些图片压缩软件/插件/中间件,比如Nginx的image_filter组件以及ImageOptim之类的软件。

解决方案:上传图片检测图片是否存在EXIF信息的旋转标记,清空标记并生成新的图片。

建议跳过GIF图片的处理

/**
  * 图片处理/压缩
  * @param $path string 原图片路径
  * @param string $new_path string 新的图片路径,为空则覆盖原图
  * @param int $cr 压缩率,为空则是70%
  * @return bool
  */
function imgDeal($path, $new_path = '', $cr = 70) {
    $new_path = $new_path ? $new_path : $path;

    $exif = exif_read_data($path, 0, true);


    $data = @getimagesize($path);
    if (!$data) return false;

    $w = $data[0];
    $h = $data[1];

    $xz = 0;
    if ($exif && !empty($exif['IFD0'])) {
        if (!empty($exif['IFD0']['Orientation'])) {
            switch ($exif['IFD0']['Orientation']) {
                case 3:
                    $xz = 180;
                    break;
                case 6:
                    $xz = -90;
                    $w = $data[1];
                    $h = $data[0];
                    break;
                case 8:
                    $xz = 90;
                    $w = $data[1];
                    $h = $data[0];
                    break;
                default:
                    # code...
                    break;
            }
        }
    }

    //读取旧图片
    $src_f = '';
    switch ($data[2]) {
        case 1:
            $src_f = imagecreatefromgif($path);
            break;
        case 2:
            $src_f = imagecreatefromjpeg($path);
            break;
        case 3:
            $src_f = imagecreatefrompng($path);
            break;
    }
    if ($src_f == "") return false;

    $rotate = @imagerotate($src_f, $xz, 0);

    $newim = imagecreatetruecolor($w,$h);

    imagecopyresampled($newim, $rotate, 0, 0, 1, 1, $w, $h, $w - 3, $h - 3);

    if (!imagejpeg($newim, $new_path, $cr)) return false;
    @imagedestroy($rotate);
    @imagedestroy($newim);

    return true;
}