0

我试图以编程方式减少(有损)的PNG和GIF文件的文件大小。作为这一部分,我需要减少图像中的颜色数量。我不想将所有的图像缩减为单一的颜色值,所以我正在做的是;获取图像中唯一颜色的数量,然后;将此数字除以2以减少一半的颜色数量。需要帮助了解ImageMagick/Graphicsmagick -colors选项

问题是这是行不通的。使用ImageMagic它太慢了,不会减小文件的大小,除非图像有几百种独特的颜色。无论原始图像中有多少种颜色,使用GraphicsMagick总是会生成255以下的唯一颜色值。 GraphicsMagick的另一个问题是如果图像中有任何透明像素,它会用透明替换丢失的颜色。

任何帮助将不胜感激, 谢谢。

回答

0

第一个问题,GraphicsMagick工具可以使用8位,16位或32位的量子能级进行编译。我的版本被编译为8位(默认值),这意味着可以分配给图像的最大颜色数量是256种不同的颜色(3 * 3 * 2,1个蓝色位被删除,因为人眼可以看不清楚)。显然,GraphicsMagick可以处理比这更多颜色的图像,但是当减少颜色时,它只能减少到256或更少的颜色。更大的像素量子会导致GraphicsMagick运行速度更慢并需要更多内存。例如,使用16位像素量子会导致GraphicsMagick运行速度比构建时支持8位像素量子慢15%到50%(并且需要两倍的内存)。

第二个问题;透明度处理在PNG图像中,我使用的是早期版本的GraphicsMagick(1.1我认为),无论如何,当我升级到1.3时,这个问题不再存在,这告诉我这是GraphicsMagick 1.1中的一个错误导致了这个问题。

1

减少的颜色的数量仅是有用的,如果

  1. 图像然后可以使用一个调色板,而不是存储颜色对每个像素
  2. 调色板指数的大小比的尺寸小颜色
  3. 图像格式支持调色板大小

我想你只能得到1位,4位,8位,所以2色,16色,或在那些256色格式。我想如果你要求更多,你只会被截断为256.如果你要求更少,它不会使用整个调色板。

您是否考虑转换为JPEG并使用质量设置进行播放?你最终得到更好的有损耗的晶粒控制。缺点是如果图像不是照片,但它听起来像他们有很多颜色,所以他们可能是。

如果它接近你想要的,也许选择1,4,8位,如果它有很多颜色,则选择jpeg。

+0

嗨,谢谢你的回复,这就是我的想法,但ImageMagick让你指定一个无限的颜色值出于某种原因。我需要图像保持相同的格式,JPEG也会导致图像失去透明度。你知道我有什么转基因透明度问题吗?再次感谢您的时间。 – toc777 2010-11-18 21:05:32

+0

它只在GIF吗?在GIF中,有一个调色板条目被指定为透明色 - 也许它们的色彩匹配意外地将丢失的颜色映射到它。这可能会发生,因为实际上有一种颜色被指定为透明颜色(它不是0 alpha的颜色)。它有点像一个bug。如果您使用的是Windows,请尝试使用我们的免费映像SDK for .NET http://atalasoft.com/photofree。 – 2010-11-18 21:25:04

+0

不,它只发生在PNG文件中。我正在使用Linux,并且我无法使用.NET进行此项目。谢谢你的帮助。 – toc777 2010-11-19 10:10:24

1

我认为ImageMagick的设施你以后可能会量化:

http://www.imagemagick.org/Usage/quantize/

+0

谢谢你,但我已阅读所有可用的文档。我现在的主要问题是停止GraphicsMagick将透明像素替换为不透明像素。 ImageMagick不会发生这种情况,我可以在GraphicsMagick中停止它的唯一方法是将颜色空间设置为透明;问题是这增加了文件的大小。 – toc777 2010-11-19 10:17:37

+0

将扁平化图像删除透明后,该操作解决了这一问题? – Orbling 2010-11-19 13:33:51

+0

对不起宝贝,我不明白。我想保留图像的透明度。 – toc777 2010-11-22 17:47:49