【问题标题】:How to compress images (png, jpg and so on) using objective C如何使用 Objective C 压缩图像(png、jpg 等)
【发布时间】:2013-01-24 18:44:17
【问题描述】:

我想在 OSX 上缩小 png 或 jpg。我只想缩小而不影响图像质量。
喜欢tinypng.org

有推荐的图书馆吗?我只知道imagemagick。有没有办法在本地做到这一点?或其他库来缩小/压缩图像而不影响图像质量?

我的目标是缩小文件大小,例如:

logo.png >> 476 k before shrink 
logo.png >> 50k after shrink

编辑:明确地说,我想压缩文件的大小,而不是图像分辨率。

【问题讨论】:

  • 你需要说清楚,你的意思是要缩小图片的大小,还是文件的大小? (请记住,任何文件压缩都必须使用阅读应用程序可以识别的算法完成。)
  • 你知道tinypng.org使用的方法吗?我的建议是首先了解做了什么,如何在任何语言/库中做,然后才开始担心如何在 Objective-c 中具体实现它。它执行某种形式的量化,但确切的细节在任何地方都不可用。这意味着如果不将大量不同的 png 图像上传到服务并检查结果,我们也无法知道该方法是否会为某些给定的输入产生错误的结果。最后,这种转换确实会影响图像质量。您不能执行没有的有损压缩。
  • 不,我不知道 tinypng.org 的方法。我只想压缩而不会明显损失图像质量。在 tinypng.org 上,我读到他们使用的方法在 Photoshop 等中不可用。
  • 研究无损压缩与有损压缩并与我们联系。

标签: objective-c image-processing compression shrink


【解决方案1】:

我的建议是使用http://pngnq.sourceforge.net,它会提供比ImageMagick 更好的结果,对于http://tinypng.org 中给出的单个示例,它也会产生非常相似的输出。它是论文“Kohonen Neural Networks for Optimal Color Quantization”中方法的微小 C 实现。仅此一项就更好了,因为您不再依赖封闭的未知实现。

原始 (57 KB)、tinypng.org (16 KB)、pngnq (17 KB):

使用 ImageMagick,我可以使用 LAB 色彩空间和 Floyd-Steinberg 的抖动获得 256 色的最佳量化:

convert input.png -quantize LAB -dither FloydSteinberg -colors 256 output.png

这会生成一个 16 KB 的 png,但它包含更多的视觉伪影:

【讨论】:

    【解决方案2】:

    您在使用 ImageMagick 时遇到问题吗?它具有丰富的量化功能,例如

    bool MagickQuantizeImage( MagickWand mgck_wnd, 
                              float number_colors, 
                              int colorspace_type, 
                              float treedepth, 
                              bool dither, 
                              bool measure_error )
    

    这是一个非常彻底的guide to quantization using imageMagick

    【讨论】:

    • 你能使用 ImageMagick 从i.stack.imgur.com/eJcam.png 生成一个好的量化 png 吗?我可能会在我在这里提供的答案中包含我能得到的最好的答案,但这是一个糟糕的结果。
    • @mmgp,点了,到目前为止,与 tinypng 相比,我的结果相当差...
    【解决方案3】:

    TinyPNG.org 使用图像量化 - 图像中相似的颜色被转换为 HSV 或 RGB 模型,然后根据距离进行合并。

    它是如何工作的?
    ...
    当您上传 PNG(便携式网络图形)文件时,图像中的相似颜色会组合在一起。这种技术被称为“量化”
    ...
    源:http://tinypng.org

    这里的答案概述了这样做的方法:https://stackoverflow.com/a/492230/556479

    关于这个问题也有一些答案,请参考如何在 Mac OS using objective-c 上这样做:How do I reduce a bitmap to a known set of RGB colours

    有关更深入的指南,请参阅 Wikipedia:http://en.wikipedia.org/wiki/Color_quantization

    【讨论】:

    • 你为什么假设它使用 HSV ?它也可以是 Lab、HSB、HSI、YCbCr 等,甚至 RGB。当然,这些链接都没有说明 tinypng.org 是如何做到的。执行量化的方法太多,无法猜测该服务到底做了什么。
    • 我访问过的大多数参考资料都是指使用 HSV 和 RGB 的算法,这就是我假设的原因。此外,是的,当然链接并没有说明 tinypng 是如何做到的,我没有说他们做到了。
    猜你喜欢
    • 2012-09-02
    • 2011-02-12
    • 2015-12-01
    • 2011-07-16
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多