改进使用ImageMagick将TIFF批量转换为PNG并重新取样的过程

时间:2013-09-20 15:23:29

标签: bash imagemagick

我有几个600 dpi TIFF文件夹(CCITT Group IV,黑色和白色),我需要将其转换为屏幕分辨率PNG - 所以在ImageMagick术语中,我需要转换格式并重新采样图像到~80 DPI。我的第一种方法是在单个mogrify命令中执行此操作(这是在Mac OS X上的bash中):

for folder in $(find * -maxdepth 0 -type d ); \
  do mogrify -path "$folder/medium" -format png -resample 31.5% "$folder/tiff/*.tif"; \
done

但结果很糟糕。生成的图像中的文字完全难以辨认。所以我将其改为两个步骤,(1)以原始分辨率将TIFF转换为PNG,然后(2)缩小分辨率:

for folder in $(find * -maxdepth 0 -type d ); \
  do mogrify -path "$folder/medium" -format png "$folder/tiff/*.tif"; \
  mogrify -resample 31.5% "$folder/medium/*.png"; \
done

虽然这个过程在80 dpi时产生了漂亮而清晰的结果,但是这个过程要慢得多,因为我现在正在将整个分辨率文件写入磁盘,然后再缩小分辨率。

是否有人建议在一步中完成转换和缩小分辨率的最佳方法?

2 个答案:

答案 0 :(得分:1)

sips工具可以按如下方式使用:

sips -s format png -s dpiHeight 80 -s dpiWidth 80 -z 1200 1600 test.tiff --out test.png

在结果.png中说过,DPI设置似乎没有改变。

同样在调整大小时,看起来您只能指定输出图像的绝对像素尺寸,而不能指定输入图像的百分比。因此,您必须获取输入图像的尺寸并明确计算新尺寸:

#!/bin/bash

infile=test.tiff
outfile=test.png
pct=31 # only whole numbers for bash arithmetic

height=$(sips -g pixelHeight $infile | tail -1 | cut -d: -f2)
width=$(sips -g pixelWidth $infile | tail -1 | cut -d: -f2)
sips -s format png -s dpiHeight 180 -s dpiWidth 180 -z $((height*pct/100)) $((width*pct/100)) 1600 $infile --out $outfile

答案 1 :(得分:1)

我知道我迟到了,但我正在看这个,并想知道为什么你在一次性完成这两个套装时质量很差。我想知道是否可能使用mogrify而不是convert,所以我开始尝试改进它。所以,这将是我的第一次也是最好的尝试:

#!/bin/bash
for f in */tiff/*.tif; do
   out="${f%tif}png"        # replace "tif" suffix with "png"
   out=${out/tiff/medium}   # replace "tiff" directory with "medium"
   convert "$f" -resample 31.5% "$out"
done

而且,如果仍然无效,我可以再次尝试,避免将文件写入磁盘然后重新采样,然后将PNG写入stdout,然后将其传输到第二次重新采样并写入磁盘的convert - 从而避免写入大型中间PNG的磁盘。

#!/bin/bash
for f in */tiff/*.tif; do
   out="${f%tif}png"        # replace "tif" suffix with "png"
   out=${out/tiff/medium}   # replace "tiff" directory with "medium"
   convert "$f" PNG:- | convert - -resample 31.5% "$out"
done