iOS:有什么方法可以将磁盘上的位图文件压缩为png,而无需将所有位图数据加载到内存中?

时间:2019-01-31 02:32:44

标签: ios bitmap png

我想在iOS中创建高分辨率图像。

我有很多图像,希望将它们拼接在一起。但是,正常方式(核心图形)会获得已分配的整个内存大小,当最终图像太大时,这可能会使我的应用程序崩溃。然后我尝试使用ImageIO框架。首先,我使用CGDataProvider从每个图像中获取二进制数据,然后使用NSOutputStream将所有数据一张一张地写入磁盘上的文件。然后,我在磁盘上有一个未压缩的位图文件,可以将其显示在屏幕上或上传到我的服务器。但是它的文件大小太大,无法作为图像。我尝试将其压缩为png文件。我尝试过CGImageDestination:

我使用CGDataProvider将位图文件加载为CGImageRef。据我所知,此操作不会将整个位图加载到内存中。

let provider = CGDataProvider.init(url: tmpBinaryDataPath as CFURL)
let imageInfo = self.images?.first?.getBitmapInfo()
let bufferSize = self.dataSource?.bufferSize(forCompositor: self)
let image = CGImage.init(
                          width: Int((bufferSize?.width)!), 
                         height: Int((bufferSize?.height)!), 
               bitsPerComponent: imageInfo.bigtsPerComponent,
                   bitsPerPixel: imageInfo.bitsPerPixel,
                    bytesPerRow: imageInfo.bytesPerRow, 
                          space: imageInfo.colorSpace, 
                     bitmapInfo: imageInfo.bigmapInfo,
                       provider: provider, 
                         decode: nil, 
              shouldInterpolate: false,
                         intent: imageInfo.renderingIntent)

然后我使用CGImageDestination对其进行压缩

let imageDest = CGImageDestinationCreateWithURL(outputPath as CFURL, kUTTypePNG, 1, nil)
CGImageDestinationAddImage(imageDest, result, nil)
let writeSuccess = CGImageDestinationFinalize(imageDest)

一切顺利,直到 CGImageDestinationFinalize 被调用。这会占用大量内存。当我创建大小为(1125,24360)的图像时,内存指示器会超过300 MB。

没有泄漏。

那么,有没有办法在不将所有位图数据加载到内存的情况下将磁盘上的位图文件压缩为png?或者,也许有一种逐步压缩png文件的方法?

任何建议将不胜感激。感谢阅读。

0 个答案:

没有答案