2

我有几个 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 下产生了漂亮而清晰的结果,但这个过程要慢得多,因为我现在在缩小分辨率之前将全分辨率文件写入磁盘。

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

4

2 回答 2

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
于 2013-09-20T18:18:21.037 回答
1

我知道我参加聚会迟到了,但我正在看这个,想知道为什么你一次做两个 setps 时质量会很差。我想知道它是否可能归结为使用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
于 2015-04-10T08:29:12.513 回答