PHP中Imagick getImageGeometry误将竖版图片识别为横版问题
解决Imagick获取竖版图片宽高颠倒的问题
嘿,这个问题我之前处理过!核心原因是手机拍摄的竖版图片大多带了EXIF方向标记——这类图片的实际像素存储是横版的,但会在EXIF里记录一个旋转角度,Imagick默认会自动应用这个旋转来保证画面显示正确,这就导致你拿到的宽高是旋转后的尺寸,而非图片文件原始的像素宽高。
下面分两种场景给你解决方案:
场景1:你要的是「视觉上的正确宽高」(也就是旋转后的)
如果这正是你需要的,其实当前结果没问题,但为了确保处理的一致性,建议先手动触发自动旋转:
$pdfPage = '128K_480x640.jpg'; $im = new Imagick($pdfPage); // 根据EXIF标记自动把图片转成正确的视觉方向 $im->autoOrient(); // 再获取宽高 $geo = $im->getImageGeometry(); $width = $geo['width']; $height = $geo['height'];
autoOrient()会帮你处理所有EXIF旋转的情况,之后拿到的宽高就是你肉眼看到的竖版图片的真实尺寸。
场景2:你要的是「图片文件原始像素的宽高」(忽略EXIF旋转)
如果想获取图片存储时的原始像素尺寸,不管EXIF的旋转标记,可以这么做:
$pdfPage = '128K_480x640.jpg'; $im = new Imagick($pdfPage); // 禁用Imagick自动应用EXIF旋转的行为 $im->setOption('exif:orientation', '0'); // 现在获取的就是原始像素宽高了 $geo = $im->getImageGeometry(); $originalWidth = $geo['width']; $originalHeight = $geo['height'];
另外,你也可以先读取EXIF的方向值,再手动判断是否要交换宽高:
$pdfPage = '128K_480x640.jpg'; $im = new Imagick($pdfPage); $orientation = $im->getImageOrientation(); $geo = $im->getImageGeometry(); $width = $geo['width']; $height = $geo['height']; // 当图片是90度或270度旋转时,交换宽高 if (in_array($orientation, [Imagick::ORIENTATION_ROTATE_90, Imagick::ORIENTATION_ROTATE_270])) { list($width, $height) = [$height, $width]; }
小提醒
你代码里的setResolution(600, 600)和setImageFormat('jpg')其实和宽高读取没关系,这两个是用来设置输出图片的分辨率和格式的,按需保留就行~
内容的提问来源于stack exchange,提问作者user3274549
相关产品推荐
相关产品推荐

