【问题标题】:Photos.framework throws <Error>: ImageIO: PNG zlib error but still provides UIImagePhotos.framework 抛出 <Error>: ImageIO: PNG zlib 错误但仍提供 UIImage
【发布时间】:2015-11-03 22:52:50
【问题描述】:

我在这里发现了一个类似的问题: iOS 8 (Swift) How do I get rid of this error: ImageIO: PNG zlib error? 但是有一些不同。

我从选择器中获得了PHAsset - 图像确实下载并正确显示(它使用PHCachingImageManager 类)。

但是,当我稍后尝试像这样从资产请求图像时:

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:AssetTargetSize
    contentMode:PHImageContentModeAspectFit options:nil 
    resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        if (result)
            _image = result;
}

result 变量是一个指向 UIImage 对象的指针,但它无效 - 我无法将其转换为 NSData,也无法通过 xcode 快速查看。

在日志中我只收到以下消息:&lt;Error&gt;: ImageIO: PNG zlib error 仅此而已。

我尝试按照链接问题中的建议使请求同步,但没有任何区别。

PHAsset 指向的图像在照片应用程序和照片选择器中均可见。

【问题讨论】:

  • "我尝试按照建议使请求同步..." 您能否提供更新后的代码?能够查看您如何设置 AssetTargetSize... 也会有所帮助
  • @KickimusButticus 由于它不起作用,我将代码恢复为所写的内容(我更喜欢异步),但是它是通过创建选项类并将同步属性更改为 @ 987654329@。 AssetTargetSizeCGSize 类型的静态常量,现在是硬编码的。这段代码大部分时间都有效,但是我得到了这个错误,没有任何图像的额外信息 - 但由于图像已加载到图像选择器中 - 我怀疑这是我的图像的问题
  • Camera.app 拍摄的所有方形图像都出现相同的错误
  • 你有没有让这个工作?
  • @NateBirkholz 很遗憾没有。虽然我还没有在最新的 SDK 上测试过它,但它可能已被修复。虽然如果这个线程仍然受到点击我怀疑它..

标签: ios objective-c frameworks uiimage photosframework


【解决方案1】:

我们需要启用同步选项。

PHAsset *asset = array[i];
            PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
             options.synchronous  = YES;
            PHImageManager *imageManager = [PHImageManager defaultManager];
            [imageManager requestImageForAsset:asset targetSize:CGSizeMake(200, 200) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
                badge = (UIImage *)result;
            }];

【讨论】:

    【解决方案2】:

    我通过将上述同步选项设置为 true 以及在外部设置对 requestImageForAsset 的调用的大小来解决此问题。 两者对我来说都是必需的,它才能工作。在 Swift 2.x

        let aSize = CGFloat(200) // it's really a constant elsewhere in the project
        let targetSize = CGSizeMake(aSize, aSize)
        let options = PHImageRequestOptions()
        options.synchronous = true
    
        PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFit, options: options, resultHandler: { (image, info) -> Void in
            guard let imageFor = image else { return }
            // use (now-unwrapped) imageFor here
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2022-06-15
      • 2018-06-20
      相关资源
      最近更新 更多