You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS PhotosPicker加载图片方向异常:竖图显示为横屏问题求助

解决macOS PhotosPicker加载图片方向丢失问题

问题根源在于loadTransferable(type: Image.self)无法正确解析图片的EXIF方向元数据,尤其是HEIC格式的图片——这类图片的方向信息存储在元数据中而非像素数据本身,直接加载成SwiftUI的Image类型时会丢失这部分信息,导致竖屏图片被错误地以横屏显示。

修复方案

不要直接加载成Image类型,而是先加载为Data,再通过NSImage初始化(NSImage会自动处理EXIF方向),最后转成SwiftUI的Image使用。

修正后的代码

import SwiftUI
import PhotosUI
import AppKit

struct ContentView: View {
    @State private var pickerItem: PhotosPickerItem?
    @State private var selectedNSImage: NSImage?

    var body: some View {
        VStack {
            PhotosPicker("Select a photo", selection: $pickerItem)
                .onChange(of: pickerItem) {
                    Task {
                        // 先加载图片原始数据
                        guard let imageData = try await pickerItem?.loadTransferable(type: Data.self) else {
                            selectedNSImage = nil
                            return
                        }
                        // 用NSImage自动处理方向元数据
                        selectedNSImage = NSImage(data: imageData)
                    }
                }

            if let nsImage = selectedNSImage {
                Image(nsImage: nsImage)
                    .resizable()
                    .scaledToFit()
            }
        }
        .frame(width: 300, height: 200)
        .padding()
    }
}

#Preview {
    ContentView()
}

原理说明

  • NSImage在初始化时会自动读取图片的EXIF方向信息,并根据元数据调整显示方向,无需手动编写旋转逻辑。
  • 直接加载Image类型时,Transferable协议的默认实现没有处理方向元数据,导致图片按原始像素方向显示,与实际拍摄朝向不符。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:02:45