2

I am using custom batch script to make resized copies (33% and 66%) of all PNG images in folder. Here is my code:

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

It works fine, except when the original image is indexed. In this case the smaller version of the image is RGB (so even larger file size then original image).

I have try several versions but not worked. One that I guess supposed to sort this out was fallowing:

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

But it doesn't work.

EDIT:

This is updated co, but it still doesn't work as it supposed to (see the attached image-left is original, right is resized):

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: Original image

Scaled version: Scaled image

4

2 回答 2

4

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

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

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

于 2016-03-08T22:44:37.880 回答
0

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

查找与全局

你说你想处理一个文件夹中的所有文件,然后你使用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 

调色板

看来您实际上只想输出带有“任何”颜色图而不是“特定”颜色图的调色(索引)图像。如果您想保留特定的颜色图,格伦的回答是完美的。但是,如果任何颜色图都可以,您可以使用-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

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

于 2016-03-09T09:27:28.683 回答