iOS更轻松地调整图像大小

时间:2013-06-04 16:51:47

标签: ios objective-c

我正在尝试在后台线程上调整图像大小,并且在几次内存不足警告后应用程序总是崩溃。我怎样才能重写下面的代码来解决这个问题?

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];

我已经尝试过计算比例并用代码值替换代码中的.9

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

这使图像太小。

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

你有什么理由需要手工完成吗?如果您使用UIImageView并使用initWithImage:image属性设置图片,然后更改UIImageView的图片,则图片会相应调整大小