我有自己的图像下载器类,它持有一个队列并逐个(或一次性地)下载图像,将它们写入缓存文件夹,并在需要时从缓存文件夹中检索它们。我还有一个UIImageView子类,可以通过它传递URL,通过图像下载器类来查看设备上是否已存在该图像,如果存在则显示它,否则在下载完成后下载并显示它。
当图像下载完成后,我执行以下操作。我从下载的NSData创建一个UIImage,将下载的NSData保存到磁盘并返回UIImage。
为了检索现有的图片,我这样做。
如您所见,我总是直接从下载的NSData创建UIImage,而不是使用UIImagePNGRepresentation创建NSData,因此图像永远不会被压缩。当您从压缩的NSData创建UIImage时,UIImage将在在主线程上渲染之前对其进行解压缩,从而阻止UI。由于我现在有一个包含许多小图像的UITableView,这些图像必须从磁盘下载或检索,如果出现这种情况,将会使滚动速度变慢,这是不可接受的。
现在是我的问题。用户还可以从相机胶卷中选择照片,保存它,然后它也必须出现在我的UITableView中。但是我似乎找不到一种方法将相机胶卷中的UIImage转换为NSData,而不使用UIImagePNGRepresentation。所以这是我的问题。
如何将UIImage转换为未压缩的NSData,以便稍后使用imageWithData将其转换回UIImage,使其在渲染之前不必解压缩?
或者
是否有任何方法可以在将UIImage发送到主线程之前进行解压缩并将其缓存,从而只需解压缩一次?
感谢您的帮助。
当图像下载完成后,我执行以下操作。我从下载的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发送到主线程之前进行解压缩并将其缓存,从而只需解压缩一次?
感谢您的帮助。