我想减少设备捕获的图像的字节数,因为我相信_imageScaledToSize
不会减少图片的字节数(或者是吗?) - 我想将图像的缩略图存储在本地字典中对象并且不能将全尺寸图像放入字典中。任何的想法?
5 回答
如果你想简单地压缩你的 UIImage,你可以使用
NSData *dataForPNGFile = UIImagePNGRepresentation(yourImage);
生成编码为 PNG 的图像的 NSData 版本(轻松插入 NSDictionary 或写入磁盘),或者您可以使用
NSData *dataForPNGFile = UIImageJPEGRepresentation(yourImage, 0.9f);
做同样的事情,只是在一个JPEG格式。第二个参数是JPEG的图像质量。这两个都应该产生比你的 UIImage 更小的、内存方面的图像。
使用已发布的方法调整 UIImage 的大小以创建更小的缩略图(以像素为单位)有点棘手。_imageScaledToSize 来自私有 API,我强烈建议您不要使用它。有关在记录的方法中起作用的方法,请参阅这篇文章。
前几天我遇到了这个问题,做了很多研究。我在这里找到了一个很棒的解决方案,其中包含代码:
http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/
您需要以较小的尺寸将图像绘制到图形上下文中。然后,释放原始图像。
当您说“物理尺寸”时,您指的是印刷品吗?因为您可以更改打印机页面大小。
您是在谈论用于捕获图像的像素数吗?例如,如果您有一个 3000x2000 的像素阵列,而您只想要 150x150,那么您可以裁剪图像。拍摄时,如果您有科学成像仪,则只需设置要拍摄的区域即可。相机驱动程序将包含相关说明。如果您想在 1500x1000 中捕获 3000x2000,则可以尝试对图像进行 bin,如果这是您需要的。
或者,您可以使用重新采样后捕获以使图像更小。一种这样的算法是双三次重采样,也是线性重采样——有很多变化。
我想这最后一个是你最感兴趣的......在这种情况下,请查看算法上的这个维基百科页面。或者,您可以转到FreeImage并获取一个可以读取图像并且还可以调整图像大小的库。
UIImageJPEGRepresentation
可以解决问题,但我发现使用该ImageIO
框架通常会在相同质量设置下获得明显更好的压缩结果。它可能会更慢,但根据您的用例,这可能不是问题。
(代码改编NSData
自 Zachary West 的这篇博客文章)。
#import <MobileCoreServices/MobileCoreServices.h>
#import <ImageIO/ImageIO.h>
...
+ (NSData*)JPEGDataFromImage:(UIImage*)image quality:(double)quality
{
CFMutableDataRef outputImageDataRef = CFDataCreateMutable(kCFAllocatorDefault, 0);
CGImageDestinationRef imageDestinationRef = CGImageDestinationCreateWithData(outputImageDataRef, kUTTypeJPEG, 1, NULL);
NSDictionary* properties = @{
(__bridge NSString*)kCGImageDestinationLossyCompressionQuality: @(quality)
};
CGImageDestinationSetProperties(imageDestinationRef, (__bridge CFDictionaryRef)properties);
CGImageDestinationAddImage(imageDestinationRef, image.CGImage, NULL);
CGImageDestinationFinalize(imageDestinationRef);
CFRelease(imageDestinationRef);
NSData* imageData = CFBridgingRelease(outputImageDataRef);
return imageData;
}