如何在iOS中以较低的压缩率重新创建UIImage?

如何在iOS中以较低的压缩率重新创建UIImage?,ios,image-processing,Ios,Image Processing,我有代码以非常差的质量重新创建高质量的图像,但我对我看到的结果有点困惑。代码如下: NSData *compressedData = UIImageJPEGRepresentation(bigImage,0); NSLog(@"compressedData length = %d", [compressedData length]); self.currentImage = [UIImage imageWithData:compressedData]; NSData *dataAfterComp

我有代码以非常差的质量重新创建高质量的图像,但我对我看到的结果有点困惑。代码如下:

NSData *compressedData = UIImageJPEGRepresentation(bigImage,0);
NSLog(@"compressedData length = %d", [compressedData length]);
self.currentImage = [UIImage imageWithData:compressedData];
NSData *dataAfterCompression = UIImageJPEGRepresentation(self.currentImage,1);
NSLog(@"dataAfterCompression length = %d", [dataAfterCompression length]);
哪些产出:

2012-01-02 02:47:05.615 MyApp[349:707] compressedData length = 32671
2012-01-02 02:47:06.143 MyApp[349:707] dataAfterCompression length = 251144

为什么用低质量的数据创建新图像会导致如此大的图像?

UIImageJPEGRepresentation的输入是一个二维像素数组,而不是从中创建二维数组的压缩数据。(数组可能根本不是来自压缩数据!)
uiimagejpegresentation
不知道图像来自何处,也不知道输入的“质量”。它只知道您希望它尽最大努力使输出变小(当
压缩质量
为零时),或者您希望它尽最大努力使输出准确(当
压缩质量
为一时)


JPEG压缩算法具有一些可调参数。
压缩质量
值选择一组这些参数。当您将
compressionQuality
设置为1时,压缩器将使用一组参数,无论输入数据实际上是什么,输入数据的精度损失都很小。对于任何输入数据,这些参数的精度损失很小。折衷的办法是,这些参数也会导致很少的压缩。压缩器不会认为“嗯,我应该尝试使用其他参数,看看是否通过更好的压缩获得相同的精度”。如果这是你想要的,你必须自己去做。

我不确定这是否正是你想要的,但是这个博客有一些扩展UIImage的类,它处理压缩非常好。请访问此网站:

它是如何处理压缩的“非常好”?抱歉,我只在标题为UIImage+NSCoding的类中看到图像大小调整代码,有一些代码涉及编码格式和质量,我认为这可能有助于指出压缩的正确方向,但可能我误解了问题UIImageJPEG表示的输入是UIImage,而不是二维像素阵列。我的问题是,构建一个包含32671字节数据的UIImage如何生成一个大小为251144字节的UIImage。我猜这是因为创建UIImage会解压数据并将其展开以填充整个UIImage(尽管我认为这需要花费大量时间),而且压缩图像数据实际上并不会节省太多空间。我正在寻找一个更技术性的描述,来说明为什么会发生这种情况。JPEG是一种压缩二维像素阵列的算法。因此,当您调用
uiimagejpegresentation
时,它会向
UIImage
询问其二维像素阵列,并对其进行操作。也许我的问题令人困惑,但这根本不能回答我的问题。显然,该方法需要像素数据。这不是该方法的输入,但可以肯定,要压缩图像数据,它将请求数据:)