【问题标题】:compress UIImage but keep size压缩 UIImage 但保持大小
【发布时间】:2011-11-13 14:20:23
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: ios image-processing


    【解决方案1】:

    使用 JPEG 压缩进行压缩。

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

    质量介于 0.0 和 1.0 之间

    你应该阅读UIImage documentation,里面的所有内容都有解释……

    【讨论】:

    • 目前我用这种方式。但是如你所见:image->data->image,会不会消费太多?
    • 由于您不想减小图像大小(宽度/高度),但是该图像的数据表示(位),我认为没有更好的方法。 JPEG 压缩不是立即的,但如果你想压缩数据...
    • 我看到的唯一另一种方法是在 CGBitmapContext 上以较低质量绘制 UIImage,但对于这种情况,您将需要放松色彩空间深度,例如(较少颜色)或尺寸(较小的图像尺寸),而不是图像的 NSBitmapRepresentation(使用 JPEG、PNG、TIFF、RAW、RLE ......在新的CGBitmapContext 上绘制的结果UIImage 很可能会使用未经任何压缩的RAW 像素...)
    • 你知道除了 PNG 图像我该怎么做吗?
    【解决方案2】:

    如果您的目标是让图像低于特定数据长度,则很难猜测您需要什么压缩比,除非您知道源图像始终是特定数据长度。这是一个简单的迭代方法,它使用 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 循环更安全一些,因为它会在尝试最大可能的压缩(零)后自动停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多