【发布时间】:2014-03-04 03:49:52
【问题描述】:
有时图像非常大(从互联网下载),所以我需要调整它们的大小,但不想引起内存问题,这意味着我不想将所有图像数据加载到内存中并在记忆。
我正在研究各种调整图像大小的方法,监控它们的内存使用情况。具体来说,CGContextDrawImage、CGImageSourceCreateThumbnailAtIndex 和 CGImageCreate 与 CGDataProviderRef。
现在我在使用CGImageCreate和CGDataProviderRef时遇到了一些问题,我的代码是这样的:
//This method read the data from filePath, resize the image and write the resized data to the destPath
- (void)resizeImageFileUsingCGImageCreate:(NSString*)filePath toDestPath:(NSString*)destPath {
CGFloat factor = 0.2;
CGSize originalSize = [self sizeOfImageAtURL:[[NSURL alloc] initFileURLWithPath:filePath]];
CGSize destSize = CGSizeMake((NSUInteger)(originalSize.width * factor), (NSUInteger)(originalSize.height * factor));
UIImage *srcImage = [UIImage imageWithContentsOfFile:filePath];
CGImageRef srcImgRef = srcImage.CGImage;
NSData *data = [NSData dataWithContentsOfFile:filePath];
CFDataRef cfData = (__bridge_retained CFDataRef)data;
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(cfData);
CFRelease(cfData);
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(srcImgRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef imageRef = CGImageCreate(destSize.width, destSize.height, 8, 32, 4 * destSize.width, colorSpace, bitmapInfo, dataProvider, NULL, NO, 0);
CGDataProviderRelease(dataProvider);
CGColorSpaceRelease(colorSpace);
UIImage *image = nil;
if (imageRef != NULL) {
image = [[UIImage alloc] initWithCGImage:imageRef];
CGImageRelease(imageRef);
//Why UIImageJPEGRepresentation(image, 0.5) returns nil?
[UIImageJPEGRepresentation(image, 0.5) writeToFile:destPath atomically:YES];
}
}
在代码的最后一行,UIImageJPEGRepresentation(image, 0.5) 总是返回 nil,这让我很奇怪。您能帮我指出使用CGImageCreate 和CGDataProviderRef 调整图像大小的正确方法吗?非常感谢!
【问题讨论】:
-
在
UIImageJPEGRepresentation之前,可以在UIImageView中显示UIImage吗?我认为CGDataProvider的原始数据应该是未压缩的 RGB 位图数据,而不是 png/jpeg 文件的数据。 -
谢谢@Alleen!是的,我也注意到了这个问题,因为如果我用
CGDataProviderRef dataProvider = CGImageGetDataProvider(srcImgRef)更改dataProvider,并更改factor = 1,我将得到相同大小的图像。但我不知道如何在CGDataProviderRef中缩放数据 -
也许您应该将数据作为数组进行操作?
标签: ios objective-c core-graphics core-image