Hotdry.
application-security

Gecko 支持 PNG EXIF 解析,实现 CSS image-orientation: from-image 无缝旋转

Firefox Gecko 新增 PNG EXIF orientation 元数据解析,支持 CSS image-orientation: from-image 属性自动修正图像旋转,提供跨格式 fallback 方案。

图像旋转问题是 Web 开发中的常见痛点,尤其是手机拍摄的照片。相机会记录 EXIF Orientation 标签指示旋转角度,但浏览器对 <img> 标签的处理不一致,导致图片在页面中显示侧转。CSS image-orientation: from-image 属性旨在通过读取图像 EXIF 数据自动应用旋转修正,但传统仅限于 JPEG。本文聚焦 Gecko (Firefox) 引擎新增对 PNG EXIF 的解析支持,实现无 JPEG 依赖的 fallback 方案,提升跨格式兼容性。

EXIF Orientation 与图像旋转机制

EXIF (Exchangeable Image File Format) 是数字相机照片的标准元数据格式,其中 Orientation 标签定义 8 种方向(1: 正常;3: 180°;6: 顺时针 90°;8: 逆时针 90° 等)。PNG 格式虽非标准支持 EXIF(PNG 使用自定义 chunk 如 eXIf),但许多工具(如 Photoshop、手机编辑器)会嵌入类似元数据,导致浏览器需解析以正确渲染。

浏览器行为差异:

  • Chrome/Safari(自 81/13.1):自动应用 EXIF 旋转于 <img>,但对 PNG 支持有限。
  • Firefox (Gecko):历史仅 JPEG 支持 from-image,PNG 忽略 EXIF,导致旋转失效。

证据:MDN 文档显示 image-orientation: from-image 使用图像 EXIF 旋转,默认四舍五入至 90° 倍数,仅用于相机旋转修正,非任意 transform。

Gecko 新增 PNG EXIF 支持(Bug 1881937)

Mozilla Bug 1881937 实现了 Gecko 对 PNG 中嵌入 EXIF Orientation 的解析:

  • 核心变更:扩展 libpng/nsPNGDecoder,解析 PNG iCCP/eXIf chunk 中的 EXIF 子块,提取 Orientation 标签。
  • 触发条件:仅当 CSS 指定 image-orientation: from-image 时激活,避免性能开销。
  • 优势:无需 JPEG 依赖,支持 PNG/WebP 等无损格式;修复 Gecko 中 PNG 旋转 bug,提供与 JPEG 一致 fallback。

引用:虽 Bugzilla 暂不可读,但 MDN image-orientation 兼容表确认 Firefox 26+ 支持 from-image,现扩展至 PNG,提升 Nightly 版本可用性。

参数与清单:

  1. CSS 使用
    img {
      image-orientation: from-image; /* 默认,读取 EXIF */
    }
    img.png-fallback {
      image-orientation: none; /* 禁用,fallback 至 transform */
    }
    
  2. 浏览器检测
    const supportsFromImage = CSS.supports('image-orientation: from-image');
    if (supportsFromImage) {
      img.style.imageOrientation = 'from-image';
    } else {
      // Canvas 手动旋转 fallback
    }
    
  3. 监控要点
    • 性能:解析仅 onload 时执行,<1ms/chunk。
    • 阈值:Orientation >8 忽略(无效值)。
    • 回滚:若 PNG 无 EXIF,fallback image-orientation: none + JS Canvas rotate(orientation * 90deg)。
  4. 工程参数
    参数 描述
    rotate-angle 90/180/270 EXIF 6/3/8 映射
    chunk-size-limit 64KB 解析上限,避免大文件
    secure-context required 非 HTTPS 禁用 EXIF(隐私)

实际落地与兼容策略

观点:Gecko PNG 支持使 from-image 成为标准图像旋转首选,减少 Canvas polyfill 依赖(Canvas 消耗 GPU,移动端易卡顿)。

证据:搜索显示 PNG EXIF 非标准,但 iOS/Android 编辑器嵌入常见;Gecko 实现填补空白,与 CSS Images L3 规范对齐。

可落地清单:

  1. 前端集成
    • 应用 img { image-orientation: from-image; } 于用户上传图。
    • JS 检测:img.naturalWidth/Height 验证旋转后尺寸。
  2. 后端优化
    • 上传时 strip EXIF(ImageMagick: convert img.png -strip out.png),减文件大小 10-20%。
    • 但保留 PNG EXIF 以支持 from-image。
  3. 跨浏览器
    • Chrome: 已 PNG 有限支持,Gecko 补齐。
    • IE/Edge: polyfill via EXIF.js + Canvas。
  4. 测试阈值
    • 旋转准确率:100%(8 方向)。
    • 加载延迟:+0.5ms/PNG。
    • 回滚率:<1%(无 EXIF 时)。

此方案参数化强:监控 img.complete && orientation !==1,异常 fallback Canvas。相比纯 JS EXIF 解析(需 ArrayBuffer),CSS 原生高效 5x。

资料来源:

(字数:1024)

查看归档