0

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

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

这使得图像太小。

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

4

2 回答 2

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];
于 2013-06-04T17:03:24.697 回答
0

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

于 2013-06-04T17:03:37.553 回答