你竖着拍了一张照片。手机上看是正的,相册里是正的,邮件发给自己也是正的。然后你上传到某个地方,它横躺着。没有东西转过那张图,像素从头到尾没有动过。变的是“谁在读它”。
相机的传感器是一个固定的长方形,以某一个方向被实体锁在机身里。你把手机横过来拍风景照时,传感器不会跟着转——它采集的永远是同一个长方形。
那照片为什么出来是正的?手机检测到你拿的方向,然后把它记下来。不是靠重新排列像素——那会花时间和电——而是在文件的元数据里存一张小纸条:EXIF 方向标签。
这个标签有八种值。讲白一点,它说的是“显示之前先顺时针转 90 度”或者“这张本来就是正的”。两种情况下像素数据一模一样,不同的只有那句指示。
每个打开这张图的程序,都得自己决定要不要照那句指示做。现代软件大多会。有些软件不会——而且很多上传管线为了隐私或文件大小会把元数据整个剥掉,那等于把指示删了。
结果就是一张照片同时既是正的也是横的,看是谁在看:
这就是为什么这个问题感觉很随机。它不随机——那是程序之间对一张一直都在的纸条有不同意见。
移除元数据通常是好事。EXIF 带着 GPS 坐标、设备型号、精确到秒的时间戳——那些大多数人并不打算跟照片一起公开。很多服务默认就剥掉,而且做得对。
但方向标签和 GPS 坐标住在同一个区块里。把那个区块移除,旋转指示也一起被移除了。照片现在用它原始的像素方向显示——也就是传感器当初采集到的那个方向。你横着拿手机,它就是横的。
可靠的解法是旋转图像数据本身,让像素就是正的,方向标签因此变得多余。这有时候叫“把旋转烤进去”。这样做完之后所有程序都同意,因为已经没有什么可以不同意的了。
步骤很简单:
有一个要小心的地方。某些编辑器的“旋转”是改 EXIF 标签而不是搬像素——快、无损、而且对这个问题完全没用,因为它重建的正是你想逃离的那个状况。测试方法是把结果上传到一个会剥元数据的地方,看它还正不正。
一张横躺的照片是小困扰。一百张、一半横幅一半竖立、全部混在一起,才是真的问题——因为你没办法对整批套用同一个旋转。每张照片需要的是它自己的标签所指定的那个角度。
任何“依照每个文件既有的方向标签去转”的做法都能正确处理混合批次。套一个“全部转 90 度”会修好一半、弄坏另一半。
尺寸看起来颠倒了。一张竖立照片显示成 4032 × 3024 而不是 3024 × 4032。那是诚实的像素尺寸;标签本来打算在显示的时候把它修正。
缩略图是正的,完整图不是。EXIF 可以内嵌一张小预览图,而那张预览可能已经转过了。查看器显示的是正确的缩略图和横躺的原图。
在某个浏览器正确,另一个不正确。这些年来各家浏览器对方向的处理并不一致,尤其是 CSS 背景图和 <img> 标签之间的差别。
如果你是在为网站、冲印或任何“你不会马上看到结果”的场合准备照片,交出文件之前先把旋转烤进去,每一次都值得那个多出来的步骤。