我有自己的图像下载器类,它包含一个队列并一次下载一个(或一定数量)图像,将它们写入缓存文件夹并在必要时从缓存文件夹中检索它们。我还有一个 UIImageView 子类,我可以将 URL 传递给它,通过图像下载器类,它会查看图像是否已经存在于设备上,如果存在则显示它,或者在完成后下载并显示它。
图像下载完成后,我执行以下操作。我从下载的 NSData 创建一个 UIImage,将下载的 NSData 保存到磁盘并返回 UIImage。
// This is executed in a background thread
downloadedImage = [UIImage imageWithData:downloadedData];
BOOL saved = [fileManager createFileAtPath:filePath contents:downloadedData attributes:attributes];
// Send downloadedImage to the main thread and do something with it
要检索现有图像,我会这样做。
// This is executed in a background thread
if ([fileManager fileExistsAtPath:filePath])
{
NSData* imageData = [fileManager contentsAtPath:filePath];
retrievedImage = [UIImage imageWithData:imageData];
// Send retrievedImage to the main thread and do something with it
}
如您所见,我总是直接从下载的 NSData 创建 UIImage,我从不使用 UIImagePNGRepresentation 创建 NSData,因此图像永远不会被压缩。当您从压缩的 NSData 创建 UIImage 时,UIImage 将在主线程上渲染之前对其进行解压缩,从而阻塞 UI。由于我现在有一个 UITableView,其中包含大量必须从磁盘下载或检索的小图像,因此这是不可接受的,因为它会极大地减慢我的滚动速度。
现在我的问题。用户还可以从相机胶卷中选择一张照片,保存它,它也必须出现在我的 UITableView 中。但我似乎无法找到一种方法将 UIImage 从相机胶卷转换为 NSData 而不使用 UIImagePNGRepresentation。所以这是我的问题。
如何将 UIImage 转换为未压缩的 NSData,以便稍后使用 imageWithData 将其转换回 UIImage,以便在渲染前不必解压缩?
或者
有什么方法可以在将 UIImage 发送到主线程并将其缓存之前进行解压缩,因此只需解压缩一次?
提前致谢。