You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML表单+PHP脚本上传图片:压缩导致竖图横转问题

解决PHP图片压缩时竖版图片被转为横版的问题

问题根源

竖版图片被转横版的核心原因是图片的EXIF方向元数据未被处理:手机拍摄的竖图会在EXIF信息中记录旋转角度(比如90°、270°),但GD库的imagecreatefromjpeg/imagecreatefrompng等函数默认不会读取并应用这个旋转信息,直接压缩时会按图片原始像素的方向保存,导致显示时方向错误。大尺寸图片频繁出现该问题,是因为这类图片基本由手机拍摄生成,带有完整的EXIF方向数据。

修复后的压缩函数

修改原函数,加入EXIF方向读取与图片旋转逻辑(需确保PHP开启exif扩展):

function compressImage($source, $destination, $quality) {
    $info = getimagesize($source);
    $exif = @exif_read_data($source);
    $orientation = isset($exif['Orientation']) ? $exif['Orientation'] : 1;

    // 创建图片资源
    if ($info['mime'] == 'image/jpeg') 
        $image = imagecreatefromjpeg($source);
    elseif ($info['mime'] == 'image/gif') 
        $image = imagecreatefromgif($source); 
    elseif ($info['mime'] == 'image/png') 
        $image = imagecreatefrompng($source);
    else
        return false; // 不支持的图片类型

    // 根据EXIF方向旋转/翻转图片
    switch ($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;
        case 2:
            imageflip($image, IMG_FLIP_HORIZONTAL);
            break;
        case 4:
            imageflip($image, IMG_FLIP_VERTICAL);
            break;
        case 5:
            imageflip($image, IMG_FLIP_HORIZONTAL);
            $image = imagerotate($image, -90, 0);
            break;
        case 7:
            imageflip($image, IMG_FLIP_HORIZONTAL);
            $image = imagerotate($image, 90, 0);
            break;
    }

    // 保存压缩后的图片
    imagejpeg($image, $destination, $quality);
    imagedestroy($image); // 释放资源
}

关键说明

  • exif_read_data读取图片的EXIF元数据,@符号用于抑制无EXIF信息时的警告
  • 不同Orientation值对应不同的旋转/翻转操作,覆盖所有常见手机拍照方向场景
  • 处理完成后用imagedestroy释放图片资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者Tejash Vaishnav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:35:20