我期待缩减一个UIImage
在iOS
.
我已经看到了下面的其他问题以及他们如何按尺寸缩小图像的方法.
调整图像大小Objective-C
如何在iphone中以objective-c编程调整图像
大小调整UIImage大小的最简单方法?
这些问题都是基于将图像重新调整为特定大小.在我的情况下,我希望根据最大尺寸重新调整/缩小图像.
例如,我想将最大NSData
大小设置为500 KB.我知道我可以像这样得到图像的大小://检查返回图像的大小
NSData *imageData = UIImageJPEGRepresentation(image, 0.5); // Log out the image size NSLog(@"%lu KB",(imageData.length/1024));
我想做的是这里的某种形式的循环.如果尺寸大于我设置的最大尺寸,我想稍微缩小图像,然后检查尺寸.如果尺寸仍然太大,则再次缩小,然后再次检查,直到它低于最大设定尺寸.
我不确定最好的办法是什么.理想情况下,我不希望始终将图像缩小到特定大小,但每次只能略微缩小图像.这样我可以拥有最大的(大小w/h)图像本身和最大尺寸(字节).如果我一次只略微缩小,那么最好的方法是什么呢?
编辑
要确认,我希望重新调整实际图像的大小,但重新调整图像的大小,使其小于最大NSData
长度.例如: -
检查NSData
长度
-If高于我想要将UIImage传递给方法
的最大值 - 然后
循环通过此方法每次稍微调整实际图像大小
-Until它在最大NSData
长度以下,然后返回图像?
除了最大尺寸,您还需要选择最小尺寸以及决定性能.例如,您可以检查大小UIImageJPEGRepresentation(image, 1.0)
.如果太大,你会检查0.95
或0.1
?
一种可能的方法是获得大小,UIImageJPEGRepresentation(image, 1.0)
并查看它太大的百分比.例如,假设它是600kB.然后你应该计算500.0 / 600
粗略的0.83
.那么呢UIImageJPEGRepresentation(image, 0.83)
.这不会给出500kB,但它可能足够接近.
另一种方法是开始UIImageJPEGRepresentation(image, 1.0)
.它太大了然后UIImageJPEGRepresentation(image, 0.5)
如果太大然后去,0.25
但如果太小了去0.75
.保持分裂差异,直到达到所需大小的可接受范围.
现在,你有一个常规说:
// Check if the image size is too large if ((imageData.length/1024) >= 1024) { while ((imageData.length/1024) >= 1024) { NSLog(@"While start - The imagedata size is currently: %f KB",roundf((imageData.length/1024))); // While the imageData is too large scale down the image // Get the current image size CGSize currentSize = CGSizeMake(image.size.width, image.size.height); // Resize the image image = [image resizedImage:CGSizeMake(roundf(((currentSize.width/100)*80)), roundf(((currentSize.height/100)*80))) interpolationQuality:kMESImageQuality]; // Pass the NSData out again imageData = UIImageJPEGRepresentation(image, kMESImageQuality); } }
我不建议递归调整图像大小.每次调整大小时,都会失去一些质量(通常表现为图像的"软化",细节丢失,累积效应).您总是希望返回原始图像并调整尺寸越来越小的尺寸.(作为一个小问题,这个if
陈述也是多余的.)
我可能会建议以下内容:
NSData *imageData = UIImageJPEGRepresentation(image, kMESImageQuality); double factor = 1.0; double adjustment = 1.0 / sqrt(2.0); // or use 0.8 or whatever you want CGSize size = image.size; CGSize currentSize = size; UIImage *currentImage = image; while (imageData.length >= (1024 * 1024)) { factor *= adjustment; currentSize = CGSizeMake(roundf(size.width * factor), roundf(size.height * factor)); currentImage = [image resizedImage:currentSize interpolationQuality:kMESImageQuality]; imageData = UIImageJPEGRepresentation(currentImage, kMESImageQuality); }
请注意,我没有触摸image
原始图像,而是currentImage
通过每次从原始图像调整大小来进行分配,每次都按比例递减.
顺便说一句,如果你想知道我的神秘1.0 / sqrt(2.0)
,我试图在你的迭代80%因素和我希望以2的力量调整大小的愿望之间达成妥协(因为当一个权力完成时,减少保持更多的锐度2).但要使用adjustment
你想要的任何因素.
最后,如果您在巨大的图像上执行此操作,您可能会考虑使用@autoreleasepool
块.您需要在"仪器中的分配"中分析您的应用程序并查看高水位线的位置,因为在没有自动释放池的情况下,这可能构成相当积极的内存使用.