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

iOS截图预览UIImage尺寸异常,Action Extension缩放问题求助

问题原因
  • 点击截图预览启动Action Extension时,iOS为了加快扩展启动速度,传递的是低分辨率缩略图(逻辑尺寸393x852,scale=3,对应实际像素1179x2556),而非原始截图的全分辨率数据;从相册选择时,系统会直接传递原始图片文件,因此能获取到预期尺寸。
  • 直接放大缩略图导致扩展崩溃,是因为放大后的图片内存占用剧增,超出了Action Extension的内存限制,被系统强制回收。
解决方案

1. 获取原始图片的文件URL加载高清图

不要直接使用inputItems中的UIImage,而是从NSItemProvider获取原始图片的URL,再加载完整数据:

import MobileCoreServices

guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem,
      let itemProvider = extensionItem.attachments?.first as? NSItemProvider,
      itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) else {
    return
}

itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String) { (data, error) in
    guard let imageURL = data as? URL,
          let imageData = try? Data(contentsOf: imageURL),
          let originalImage = UIImage(data: imageData) else {
        return
    }
    // 此时originalImage为原始分辨率(1179x2556,scale=1)
    self.handleOriginalImage(originalImage)
}

2. 避免拉伸缩略图,优先用原始图处理

如果需要先显示预览,可以用缩略图临时展示,但后续处理必须基于原始图片文件,不要对缩略图进行放大——拉伸后的图片不仅模糊,还会浪费内存。

3. 优化内存占用防止崩溃

处理大尺寸图片时,用CGImageSource按需加载,避免一次性占用过多内存:

func loadOptimizedImage(from url: URL, targetSize: CGSize) -> UIImage? {
    guard let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else { return nil }
    let options: [CFString: Any] = [
        kCGImageSourceShouldCache: false,
        kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceThumbnailMaxPixelSize: max(targetSize.width, targetSize.height)
    ]
    guard let cgImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) else { return nil }
    return UIImage(cgImage: cgImage)
}

调用时可传入目标尺寸,既能获取清晰的缩放图,又能控制内存使用。

4. 确认扩展权限配置

检查Info.plist中是否正确配置了图片支持:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.ui-services</string>
</dict>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:23:19