有时候图片非常大(从互联网下载),因此我需要调整它们的大小,但不想引起内存问题,这意味着我不想将所有图像数据加载到内存中并在内存中调整它们的大小。
我正在研究几种调整图像大小的方法,并监视它们的内存使用情况。具体来说,使用“CGContextDrawImage”、“CGImageSourceCreateThumbnailAtIndex”和带有“CGDataProviderRef”的“CGImageCreate”。
现在我在使用“CGImageCreate”和“CGDataProviderRef”时遇到了一些问题,我的代码如下:
在代码的最后一行,
我正在研究几种调整图像大小的方法,并监视它们的内存使用情况。具体来说,使用“CGContextDrawImage”、“CGImageSourceCreateThumbnailAtIndex”和带有“CGDataProviderRef”的“CGImageCreate”。
现在我在使用“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
之前,你能否将UIImage显示在UIImageView中?我认为CGDataProvider
的原始数据应该是未压缩的RGB位图数据,而不是png/jpeg文件的数据。 - Allen HsuCGDataProviderRef dataProvider = CGImageGetDataProvider(srcImgRef)
更改dataProvider,并将factor = 1
更改,我将获得相同大小的图像。但我不知道如何在CGDataProviderRef
中缩放数据。 - Hang