I'm suffered from resizing image from original resolution image, which is about 8MP, my output resolution is about 2MP. Sometimes, it show memory warning for iPhone4S device, and I did some release in memorywarning, but it sometimes make my program crash for alassetlibrary usage problem. Here's my question, I want to prevent from memory warning during my resizing fullReoslutionImage.
I tried many method for resizing image. my current method is about 44MB increase for peak memory usage. it seems too large...for overall system, it will have a peak for 57 MB..... I tried CGImageSourceCreateThumbnailAtIndex, but it introduce more memory increase than my current method.
Here's my solution, but it still introduce sometimes memorywarning. Do you have other methods? Could you help me? some ideas, 1. Other iOS API? 2. native library for on-the-fly resize for JPEG decoder? 3. YUV422 resizer instead of RGBA. 4. ..... I have no idea...
UIImage *image=[self oriImageThumbnailAtIndex:asset];
CGInterpolationQuality interpolationQuality=kCGInterpolationMedium;
CGSize newSize=[self sizeDown:image.size];
image2 =makeResizedImageRotate(image, newSize, interpolationQuality,[defaultRep orientation]);
-(UIImage *) oriImageThumbnailAtIndex:(ALAsset *)asset
{
int times=0;
ALAssetRepresentation* assetRepresentation=asset.defaultRepresentation;
long long imageDataSize = [assetRepresentation size];
uint8_t* imageDataBytes = (uint8_t*) malloc(imageDataSize);
[assetRepresentation getBytes:imageDataBytes fromOffset:0 length:imageDataSize error:nil];
NSData *data = [NSData dataWithBytesNoCopy:imageDataBytes length:imageDataSize freeWhenDone:YES];
UIImage *image2=nil;
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);
CGImageRef thumbnail;
if (src)
{
float _maxSize=RESIZE_IMAGE_BIG_SIDE;
thumbnail = CGImageSourceCreateImageAtIndex(src, 0, NULL); // Create scaled image
image2 = [UIImage imageWithCGImage:thumbnail];
CGImageRelease(thumbnail);
}else{
NSLog(@"resizeImage:(ALAsset *)asset error!!!");
}
return image2;
}
UIImage* makeResizedImageRotate(UIImage *inimage,CGSize newSize,CGInterpolationQuality interpolationQuality,UIImageOrientation orient) {
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = inimage.CGImage;
// Compute the bytes per row of the new image
size_t bytesPerRow = CGImageGetBitsPerPixel(imageRef) / CGImageGetBitsPerComponent(imageRef) * newRect.size.width;
bytesPerRow = (bytesPerRow + 15) & ~15; // Make it 16-byte aligned
CGBitmapInfo cgbmpinfo=CGImageGetBitmapInfo(imageRef);
CGContextRef bitmap = CGBitmapContextCreate(NULL,
newRect.size.width,
newRect.size.height,
CGImageGetBitsPerComponent(imageRef),
bytesPerRow,
CGImageGetColorSpace(imageRef),
cgbmpinfo);
if(bitmap!=nil)
CGContextSetInterpolationQuality(bitmap, interpolationQuality);
else
NSLog(@"bitmap==nil");
// Draw into the context; this scales the image
CGContextDrawImage(bitmap, newRect, imageRef);
// Get the resized image from the context and a UIImage
CGImageRef resizedImageRef = CGBitmapContextCreateImage(bitmap);
UIImage *resizedImage = [UIImage imageWithCGImage:resizedImageRef];
CGContextRelease(bitmap);
CGImageRelease(resizedImageRef);
resizedImage=rotateImage( resizedImage, orient);
// Clean up
// [resizedImage autorelease]; will introduce BAD_ADDRESS
return resizedImage;
}