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
相关产品推荐
相关产品推荐

