2013-06-04 29 views
0

我想调整后台线程上的图像大小,并且应用程序总是在一些低内存警告后崩溃。我如何重写下面的代码来解决这个问题?iOS更简单的方式来调整图像大小

float max = 1024*1024; 
NSData *pngData = UIImagePNGRepresentation(setImage); 

while ([pngData length] > max) { 
    pngData = nil; 
    CGSize newSize = CGSizeMake(setImage.size.width*.9, setImage.size.height *.9); 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSLog(@"scale: %f", (1024.0*1024.0)/((float)[pngData length])); 
    pngData = UIImagePNGRepresentation(image); 
} 

NSLog(@"image length: %i",[pngData length]); 
[pngData writeToFile:imageLocation atomically:YES]; 

我已经尝试通过计算规模这样做的,带有刻度值

float scale = (max)/((float)[pngData length]); 
CGSize newSize = CGSizeMake(setImage.size.width*scale, setImage.size.height *scale); 

本作的图像太小更换1.9英寸的代码。

最终目标是从相机拍摄图像并将其保存到磁盘。我原本不得不调整图像大小,因为我在加载图像时收到了“低内存警告”。

+0

看看接受这个问题的答案http://stackoverflow.com/questions/ 12773074/received-memory-warning-on-setimage –

回答

1

您的代码导致无限循环并创建图像,直到内存不足。尝试类似这样来修复无限循环:

float max = 1024*1024; 
NSData *pngData = UIImagePNGRepresentation(setImage); 
CGSize newSize = setImage.size; 

while ([pngData length] > max) { 
    newSize = CGSizeMake(newSize.width * 0.9, newSize.height * 0.9); 
    UIGraphicsBeginImageContext(newSize); 
    [setImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSLog(@"scale: %f", (1024.0*1024.0)/((float)[pngData length])); 
    pngData = UIImagePNGRepresentation(image); 
    image = nil; 
} 

NSLog(@"image length: %i",[pngData length]); 
[pngData writeToFile:imageLocation atomically:YES]; 
+0

这个效果更好。该应用程序不会崩溃,但我仍然得到低内存警告。 –

+0

没关系。只要内存在某个时刻被正确清理,内存不足警告并不一定意味着应用程序出现问题。使用仪器来验证你没有记忆的真正问题。 – rmaddy

0

是否有任何理由需要手动执行此操作?如果您使用UIImageView并设置图像要么initWithImage:或与image属性,然后更改UIImageView的帧图像将调整相应

+0

目标是在文件大小小于1MB的磁盘上创建新的PNG。 – rmaddy

+0

@rmaddy你是对的!我正在从相机拍摄图像并将其保存到磁盘。我可以用这个编辑我的文章吗? –

+0

也使用这种方法,图像保持它的大小,这导致性能下降和图像质量下降相比,在UIImageView的大小图像 – pre