Ios 我可以在核心数据中存储解压缩后的图像吗

Ios 我可以在核心数据中存储解压缩后的图像吗,ios,core-data,uiimage,cgimageref,Ios,Core Data,Uiimage,Cgimageref,我正在处理大量的大图像,我正在做一些测试,试图提高加载图像的性能。现在,即使我已经在另一个队列上解压jpg,它仍然需要一点时间,主要是与iOS中包含的相册应用程序相比。此外,如果我快速传递图像,我可以产生记忆警告 所以我要做的是将CGImageRef或已经解压缩的UIImage:原始数据存储到核心数据中。但我找到的所有答案和选项都使用UIImageJPEG表示,但这样做会再次压缩图像,不是吗 有人知道有没有办法?我是否对问题进行了错误的聚焦?是的,您可以将图像转换为NSData并存储该数据。例如

我正在处理大量的大图像,我正在做一些测试,试图提高加载图像的性能。现在,即使我已经在另一个队列上解压jpg,它仍然需要一点时间,主要是与iOS中包含的相册应用程序相比。此外,如果我快速传递图像,我可以产生记忆警告

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


有人知道有没有办法?我是否对问题进行了错误的聚焦?

是的,您可以将图像转换为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文件中。

理想情况下,不要在内存中保留大量大图像的UIImage对象。它们将发出u内存警告。 如果图像是本地文件,您可以做一件事,使用背景线程将大图像缩放到适合旋转木马的大小。保存这些缩略图并将其映射到原始图像。 加载carousel的缩略图,并使用原始图像文件进行详细的图像查看。缩略图应为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;

}

第二个答案是关于如何将图像作为NSData获取,您可以使用核心数据存储这些图像。但这已经是一个压缩图像了,不是吗?一旦我想将其用作UIImage,该BLOB中包含的jpg将必须经过解压缩过程。我错了吗?我没有用缩略图。基本上它只是一个滚动视图。我在后台线程中加载图像,但是当我滚动得太快时,我可以处理前面的线程,因此会出现内存警告。您可以放置一个占位符图像,然后尝试在运行时使用块缩放大图像,这将降低内存需求,但UI响应感谢您的回答。我想我会在有机会的时候上传一些代码,以便对问题进行更详细的描述。