2011-11-13 40 views
4

我尝试使用UIImageView来显示照片。但照片有时会有点大,我想压缩它,但我想保持它的大小。 例如,一张照片是4M,尺寸为320X480。我想压缩它,它可能有1M,但仍然有320X480的大小。压缩UIImage但保持大小

谢谢!

回答

18

使用JPEG压缩对其进行压缩。

lowResImage = [UIImage imageWithData:UIImageJPEGRepresentation(highResImage, quality)]; 

其中质量是0.0和1.0之间

你应该阅读UIImage documentation,一切都在那里解释...

+1

目前我用这种方式。但正如你看到的:image-> data-> image,它会消费太多吗? – scorpiozj

+0

因为你不想减小图像的大小(宽度/高度),但是这个图像的数据表示(比特),我不认为有一个更好的方法。 JPEG压缩不是直接的,但是如果你想要压缩数据...... – AliSoftware

+0

我看到的唯一的另一种方法是在'CGBitmapContext'上以较低的质量绘制'UIImage',但是对于这种情况,你需要松开例如颜色空间深度(较少颜色)或大小(较小图像尺寸),而不是在图像的NSBitmapRepresentation(使用JPEG,PNG,TIFF,RAW,RLE ...的像素的编码/压缩)它甚至可能会更糟糕,因此,在新的'CGBitmapContext'上绘制的结果'UIImage'很可能会使用RAW像素而没有进行任何压缩......) – AliSoftware

3

如果你的目标是获得一个特定的数据长度下面的图片,很难猜测您需要的压缩比率,除非您知道源图像始终是特定的数据长度。下面是一个使用JPEG压缩,实现了目标长度...比方说1MB,以匹配问题,一个简单的迭代方法:

// sourceImage is whatever image you're starting with 

NSData *imageData = [[NSData alloc] init]; 
for (float compression = 1.0; compression >= 0.0; compression -= .1) { 
    imageData = UIImageJPEGRepresentation(sourceImage, compression); 
    NSInteger imageLength = imageData.length; 
    if (imageLength < 1000000) { 
     break; 
    } 
} 
UIImage *finalImage = [UIImage imageWithData:imageData]; 

我见过一些使用while循环通过以压缩图像的方法。 9或其他任何东西,直到达到目标大小,但我认为你会通过连续压缩/重构图像来损失图像质量和处理器周期。另外,这里的for循环更安全一些,因为它在尝试最大可能的压缩(零)后会自动停止。