【发布时间】:2011-11-13 14:20:23
【问题描述】:
我尝试使用UIImageView 来显示照片。但有时照片有点大,我想压缩它。但我想保持它的大小。
例如,一张照片为 4M,尺寸为 320X480。我想压缩它,它可能有 1M 但仍然有 320X480 的大小。
谢谢!
【问题讨论】:
标签: ios image-processing
我尝试使用UIImageView 来显示照片。但有时照片有点大,我想压缩它。但我想保持它的大小。
例如,一张照片为 4M,尺寸为 320X480。我想压缩它,它可能有 1M 但仍然有 320X480 的大小。
谢谢!
【问题讨论】:
标签: ios image-processing
使用 JPEG 压缩进行压缩。
lowResImage = [UIImage imageWithData:UIImageJPEGRepresentation(highResImage, quality)];
质量介于 0.0 和 1.0 之间
你应该阅读UIImage documentation,里面的所有内容都有解释……
【讨论】:
CGBitmapContext 上以较低质量绘制 UIImage,但对于这种情况,您将需要放松色彩空间深度,例如(较少颜色)或尺寸(较小的图像尺寸),而不是图像的 NSBitmapRepresentation(使用 JPEG、PNG、TIFF、RAW、RLE ......在新的CGBitmapContext 上绘制的结果UIImage 很可能会使用未经任何压缩的RAW 像素...)
如果您的目标是让图像低于特定数据长度,则很难猜测您需要什么压缩比,除非您知道源图像始终是特定数据长度。这是一个简单的迭代方法,它使用 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 循环将图像压缩 0.9 或其他大小,直到达到目标大小,但我认为您会通过连续压缩/重构而损失图像质量和处理器周期图片。此外,这里的for 循环更安全一些,因为它会在尝试最大可能的压缩(零)后自动停止。
【讨论】: