我正在尝试在后台线程上调整图像大小,并且在几次内存不足警告后应用程序总是崩溃。我怎样才能重写下面的代码来解决这个问题?
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);
这使图像太小。
最终目标是从相机拍摄图像并将其保存到磁盘。我最初不得不调整图像大小,因为我在加载图像时收到“低内存警告”。
答案 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
的图片,则图片会相应调整大小