手机竖着拍的照片上传后在前台横躺,媒体库编辑页里点旋转四次才对。原图 EXIF 的 Orientation 是 6,处理后这个标签已经不存在。乍看像缓存或者权限的锅,追下去往往不是。

$img = new Imagick($path);
$orientation = $img->getImageOrientation();
$img->autoOrientImage();
$img->stripImage();

追下去是这么回事:主题在上传后调了 Imagick 的 stripImage 清理隐私信息,这个方法会把所有 EXIF 一起清掉,包括决定显示方向的 Orientation。浏览器拿不到方向标记,就按像素原始方向渲染。

「Imagick 剥离 EXIF 方向丢失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

具体做法是,在 stripImage 之前读出 Orientation 的值 存到变量里;按这个值调用 autoOrientImage 把像素转正;转正之后再剥离 EXIF 顺序不能反。

验收就看一点,竖拍图上传后前台直接是正的,处理后的文件没有 Orientation 也不再横躺。

作者 9823189