1

我正在处理大量大图像的旋转木马,并且正在进行一些测试以提高加载图像的性能。现在,即使我已经在不同的队列中解压 jpg,它仍然需要一点时间,主要是与 iOS 中包含的相册应用程序相比。此外,如果我非常快地传递图像,我可以产生 memoryWarnings。

所以我想要做的是将 CGImageRef (或 UIImage 已经解压缩:原始数据)存储到核心数据中。但是我找到的所有答案和选项都在使用 UIImageJPegRepresentation,但是这样做我会再次压缩图像,不是吗?

有人知道有没有办法?我是否错误地关注问题?

4

2 回答 2

0

是的,您可以将图像转换为 NSData 并存储它。例子:

Entity *testEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:__managedObjectContext];
NSString *photoPath = [[NSBundle mainBundle] pathForResource:@"photo" ofType:@"png"];
if ([[NSFileManager defaultManager] fileExistsAtPath:photoPath]) {
    NSData *data = [NSData dataWithContentsOfFile:photoPath];
    [testEntity setPhoto:data];
}

这会将图像作为 BLOB 数据存储在 sqlite 文件中。

于 2013-01-24T15:59:09.027 回答
0

理想情况下,你永远不会在内存中保留大量 UIImage 对象的大图像。它们会给你内存警告。如果图像是本地文件,您可以做一件事,使用后台线程将大图像缩放到适合轮播的大小。保存这些缩略图并将它们映射到原始图像。为轮播加载缩略图,并使用原始图像文件进行详细图像查看。缩略图将是 png 以获得最大性能。Jpeg 解码不是 iOS 的原生,并且需要比 png 更多的 cpu 来解码它们。你没有要将缩略图数据保留在核心数据中,根据我的经验,.png 文件会做得很好。您可以使用以下代码加载图像

 UIImage * image = [UIImage imageWithContentsOfFile:filePath];

这是调整图像大小的代码

- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize {
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = image.CGImage;

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

// Set the quality level to use when rescaling
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height);

CGContextConcatCTM(context, flipVertical);
// Draw into the context; this scales the image
CGContextDrawImage(context, newRect, imageRef);

// Get the resized image from the context and a UIImage
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

CGImageRelease(newImageRef);
UIGraphicsEndImageContext();

return newImage;

}

于 2013-01-24T15:59:42.910 回答