iPhone iOS的图像调整大小以实现最低的内存使用率解决方案 [英] iPhone iOS's image resize for lowest memory usage solution

查看:252
本文介绍了iPhone iOS的图像调整大小以实现最低的内存使用率解决方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要从原始分辨率的图像调整图像大小,这大约是8MP,我的输出分辨率大约是2MP. 有时,它会显示iPhone4S设备的内存警告,并且我在内存警告中做了一些发布,但有时会因为软件库使用问题而使我的程序崩溃. 这是我的问题,我想在调整fullReoslutionImage大小时避免出现内存警告.

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.

我尝试了许多调整图像大小的方法. 我当前的方法是将峰值内存使用量增加约44MB.似乎太大...对于整个系统来说,它的峰值为57 MB ..... 我尝试了CGImageSourceCreateThumbnailAtIndex,但是它比当前的方法增加了更多的内存.

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.

这是我的解决方案,但有时仍会引入内存警告.您还有其他方法吗? 你可以帮帮我吗?一些想法, 1.其他iOS API? 2.可以实时调整JPEG解码器大小的本机库吗? 3. YUV422调整器而不是RGBA. 4. .....我不知道...

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;

}

推荐答案

我发现当我使用第三方JPEG解码库(libjpeg-turbo)对其进行解码并在2048x2048 UIImage下调整大小时,它的性能大大降低了.不会减少太多.)因此,如此频繁的内存更改可能是由创建大于2Kx2K的UIImage引起的.希望这会有所帮助.

I found it was reduced much when I use 3rd party JPEG decode library(libjpeg-turbo) to decode&resize it under 2048x2048 UIImage.(even the total memory is not reduced much.) So the memory wanring happen so often may be caused by creating UIImage larger than 2Kx2K. Hope this helps.

这篇关于iPhone iOS的图像调整大小以实现最低的内存使用率解决方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆