Sometimes images are very large (downloaded from the Internet), so I need to resize them, but I don’t want to cause a memory problem, which means I don’t want to load all the image data into memory and resize it within the memory.
I am exploring the servile ways of resizing an image, tracking their use in memory. In particular CGContextDrawImage, CGImageSourceCreateThumbnailAtIndexand CGImageCreatewith CGDataProviderRef.
Now I am facing some problems when using CGImageCreatewith CGDataProviderRef, and my code is as follows:
- (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);
[UIImageJPEGRepresentation(image, 0.5) writeToFile:destPath atomically:YES];
}
}
UIImageJPEGRepresentation(image, 0.5) nil, . CGImageCreate CGDataProviderRef? !