uni.getImageInfo 是判断图片横竖方向最直接、最可靠的方式,它返回原始宽高,无需解析 EXIF 或依赖设备方向;width > height 为横图,否则为竖图;仅在需还原拍摄真实朝向时才需结合 EXIF Orientation 字段处理。

uni.getImageInfo 是判断图片横竖方向最直接、最可靠的方式——它返回原始宽高,无需解析 EXIF,也不依赖设备方向。
用 uni.getImageInfo 拿原始宽高比
图片的横/竖本质是其原始像素尺寸关系,不是显示容器或设备朝向。只要拿到 width 和 height,就能立刻判断:
- 若
width > height→ 横图(landscape) - 若
width → 竖图(portrait) - 若相等 → 方图(square),按业务需要归类
注意:uni.getImageInfo 返回的是图片文件本身的像素尺寸,不受 <image></image> 标签的 mode 或 CSS 影响。哪怕你用 mode="scaleToFill" 强行拉伸,原始宽高也不会变。
别用 windowWidth / windowHeight 判断图片方向
这是常见误区。设备屏幕宽高只反映当前视口,和图片本身无关。比如用户在竖屏手机里预览一张 1920×1080 的横图,windowWidth ,但图片仍是横图。
典型错误写法:
const sys = uni.getSystemInfoSync()
if (sys.windowWidth > sys.windowHeight) { /* 错!这是设备方向,不是图片方向 */ }什么时候必须看 EXIF?
仅当你要「还原拍摄时的真实朝向」时才需要 EXIF 的 Orientation 字段。例如:用户横屏拍的照片,EXIF 可能标记为 6(顺时针旋转 90°),此时原始宽高仍是竖向像素(比如 4000×3000),但逻辑上应按横构图处理。
这种情况要分两步:
- 先调
uni.getImageInfo得到width/height和orientation字段 - 再根据
orientation值(1/3/6/8)推算「视觉上」的宽高关系 - 例如
orientation === 6:原始是 4000×3000,但实际应视为 3000×4000(旋转后)
大多数场景(如缩略图裁剪、列表布局、Canvas 绘制)只需原始宽高;只有上传后需服务端渲染或前端 Canvas 重绘时,才需主动处理 EXIF 旋转。
Canvas 绘图前务必做方向校验
在 ctx.drawImage 前,如果没校验图片方向,容易把横图强行塞进竖图容器,导致严重变形:
uni.getImageInfo({ src: imgPath }).then(res => {
const isLandscape = res.width > res.height
// 后续 layout 或 draw 逻辑分支从此开始
})容易踩的坑:
- 直接传死值给
drawImage(img, 0, 0, 300, 200)→ 忽略原图比例 - 用 rpx 固定 canvas 宽高但没适配不同方向图片 → 横图被压缩、竖图被拉长
- 在 H5 和小程序里混用
object-fit和mode,误以为样式生效了就等于图片方向被识别了
真正关键的判断点永远落在 res.width 和 res.height 上,其余都是衍生处理。


















