2016-03-08 113 views
0

我使用自定义批处理脚本来调整文件夹中所有PNG图像的大小调整后的副本(33%和66%)。这是我的代码:使用ImageMagick调整带索引的PNG图像,同时保留颜色图

for f in $(find /myFolder -name '*.png'); 
do 
sudo cp -a $f "${f/%.png/-3x.png}"; 
sudo convert $f -resize 66.67% "${f/%.png/-2x.png}"; 
sudo convert $f -resize 33.33% $f; 
done 

它工作正常,除了当原始图像索引。在这种情况下,图像的较小版本是RGB(因此甚至更大的文件大小,然后原始图像)。

我尝试了几个版本,但没有工作。我猜应该把这个问题整理出来:

for f in $(find /myFolder -name '*.png'); 
do 
sudo cp -a $f "${f/%.png/-3x.png}"; 
sudo convert $f -define png:preserve-colormap -resize 66.67% "${f/%.png/-2x.png}"; 
sudo convert $f -define png:preserve-colormap -resize 33.33% $f; 
done 

但它不起作用。

编辑:

这是更新的合作,但它仍然是它应该(见附件图像左边是原始的,权调整)不工作:

for f in $(find /myFolder -name '*.png'); 
do 
    sudo cp -a $f "${f/%.png/-3x.png}"; 
    numberOfColors=`identify -format "%k" $f` 

    convert "$f"              \ 
    \(+clone -resize 66.67% -colors $numberOfColors -write "${f/%.png/-2x.png}" +delete \) \ 
    -resize 33.33% -colors $numberOfColors "$f" 
done 

enter image description here

原图: Original image

缩放版本: Scaled image

+1

是否需要保留特定的精确色彩映射?或者您希望确定调整大小的图像很小并且索引为* a *颜色映射,但您并不介意该颜色映射中包含什么内容?答案会有所不同。 –

+0

我不介意彩色地图。我想确保调整后的图像很小。这是网络上的视网膜图像。第一张(原始图像)用于带有3dpi屏幕的屏幕等。 –

+0

请您分别提供原始图像 - 而不是加入到输出图像。 –

回答

2

使用“-sample”而不是“-resize”来保留颜色集。这导致调整大小由最近邻居颜色选择而不是任何种类的内插来完成。

否则,由于PNG PLTE块的大小限制为256色,因此色彩映射最终会超过256种颜色,并且png编码器无法保留它。不过,我不能保证你会喜欢结果的外观。

此外,请确保您使用的是最新版本的ImageMagick。 我没有在当前版本(6.9.3-7)中观察到这个问题。你的脚本工作正常,并产生干净的-2x和-3x图像。

+0

可能OP可能使用'-resize'以获得令人满意的插值,然后使用'-colors 250'或'-colors 60'来让您的图书馆使用patricised colormap? –

0

有几件事情来解决这里...

发现VS水珠

你说你要处理的文件夹中的所有文件,然后使用find将倒查成子目录也是如此。如果您只想处理当前目录中的文件,则可以让bash直接为您进行匹配。所以,与其

for f in $(find . -name "*.png"); do 

,你可以这样做:

shopt -s nullglob 
for f in *.png; do 

性能

您运行convert两次,并加载原始图像的两倍,这是不是很有效。您可以运行加载单个映像并调整为两种不同大小的单个进程,并将这两个进程写入磁盘。所以,与其

for ...; do 
    convert ... 
    convert ... 
done 

你可以写下面开始一个convert,一旦读取图像,在内存中克隆它,并把它写出来,在内存中删除备用副本,然后调整原始图像和重新保存。

for ...; do 
    convert "$f"              \ 
     \(+clone -resize 66.67% -write "${f/%.png/-2x.png}" +delete \) \ 
     -resize 33.33% "$f" 
done 

调色板

看来你实际上只需要输出码垛(索引)图像与“任何”颜色表,而不是用“具体”颜色表。格伦的答案是完美的,如果你想保留一个特定的色彩地图。但是,如果任何色彩图表正常,则可以使用-colors将结果图像中的颜色减少到PNG库可以决定创建堆叠图像的级别。格伦知道很多比我写的更多!但是,我认为如果将颜色减少到250(或大约),则可能会获得256个条目的颜色映射,如果将颜色减少到60个左右,则会得到64个条目的颜色映射。所以,你会怎么做:

shopt -s nullglob 
for f in *.png; do 
    sudo cp ... ... 
    convert "$f"              \ 
     \(+clone -resize 66.67% -colors 250 -write "${f/%.png/-2x.png}" +delete \) \ 
     -resize 33.33% -colors 250 "$f" 
done 

你可以尝试用色彩其他数字实验,看看它如何影响文件大小 - 你需要将取决于你的图像数量。

+0

性能不是我最大的问题(我正在处理几十张图片而不是数千张),但它很好用。我想处理目录和子目录中的所有图像,以便找到适合我的作品。解决方案中的问题是,我在文件夹(和子文件夹)中有几种不同类型的PNG(8位,24位,索引,未索引...),因此我需要不同图像的不同参数。到目前为止,请参阅我的帖子编辑。它没有按预期工作。有大的(方形)不同颜色的区域。 –