使用ImageMagick调整索引的PNG图像大小,同时保留颜色贴图

问题描述 投票:0回答:2

我使用自定义批处理脚本来制作文件夹中所有PNG图像的已调整大小的副本(33%和66%)。这是我的代码:

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

但它不起作用。

编辑:

这是更新的co,但它仍然不能正常工作(参见附图 - 左边是原始的,右边是调整大小):

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

imagemagick png imagemagick-convert indexed-image
2个回答
3
投票

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

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

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


0
投票

这里有几件事要解决......

找到vs glob

你说你想要处理文件夹中的所有文件,然后你使用find,它也将搜索到子目录。如果您只想处理当前目录中的文件,可以让bash直接为您执行globbing。所以,而不是

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 

调色板

看起来你实际上只想输出带有“任意”色彩图的palettised(索引)图像而不是“特定”色彩图。如果你想保留一个特定的色彩图,格伦的答案是完美的。但是,如果任何色彩映射都可以,则可以使用-colors将生成的图像中的颜色减少到PNG库可以决定创建palettised图像的级别。在他写这篇文章时,格伦比我更了解这一点!但是,我认为如果你将颜色减少到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

您可以尝试使用其他数量的颜色进行试验,看看它们如何影响文件大小 - 您需要的数字取决于您的图像。

© www.soinside.com 2019 - 2024. All rights reserved.