shell - 如何在命令行上以毫米为单位更改图像的打印尺寸?

标签 shell imagemagick image-manipulation

ImageMagick 似乎最适合在命令行上转换图像文件。但是,它仅支持更改以像素为单位的大小和以每像素英寸为单位的分辨率,但不支持更改打印尺寸(如命令 identify -verbose 所示)。我想:

  • 快速获取以毫米为单位的图像打印尺寸
  • 更改图像打印尺寸(通过将高度或宽度或两者都设置为以毫米为单位的新值)

这应该可以通过简单的 shell 脚本编写,不是吗?

最佳答案

图像的唯一绝对尺寸是像素

分辨率mm密度分辨率 只在您渲染 某个表面上的图像(屏幕显示、纸质打印输出)。

它们有自己内置的、依赖于硬件的分辨率。如果您知道,您可以计算图像尺寸的 mm 值,前提是您要以“自然大小”渲染它。

很多时候您不想要“自然尺寸”——有时您可能想要:“用图像填充 Letter 尺寸的纸张”(缩放以适合)。如果发生这种情况,则必须放大或缩小相同的图像——但屏幕或打印机分辨率不会改变,只是插值算法将开始添加像素以填充间隙(放大)或删除像素以使图片显得更小(缩小)。

因此,在有人给出有关如何计算“以毫米为单位的图像尺寸”(以图像的自然尺寸表示)的算法之前,您需要知道目标设备(屏幕或打印机)的分辨率。


编辑:

如果您将给定图像(其大小以像素为单位)嵌入 PDF(其中源文档来自例如 LaTeX),您仍然必须指定...

  • ...您希望图像以何种分辨率呈现在页面上
  • ...或者您希望以何种尺寸(以毫米为单位或以页面尺寸的百分比为单位)呈现图像。

如果不对图像重新采样,您无法同时确定两个这些参数。选择一个,另一个由您的选择隐式决定。

举个例子。

假设您的原始图片为 2160x1440 像素。

您的 LaTeX -> PDF 转换由 Ghostscript 完成。 Ghostscript 在内部对所有光栅对象使用 720 dpi 的默认分辨率。因此,除非您为 PDF 转换明确地将“分辨率”设置为不同的值,否则图像在 PDF 或打印页面上的大小将为 3x2 英寸(76.2 x 50.8 毫米)。

如果将分辨率设置为 90 dpi,则图像在页面上的大小为 24x16 英寸(609.6 x 406.4 毫米)。

如果您将分辨率设置为 270 dpi(接近常用的 300 dpi),图像尺寸将变为 8x5.333 英寸(203.2 x 135.5 毫米)。

所以 shell 脚本的公式是:

 # 25.4 mm == 1 inch

  image_width_px=W                      # in pixels (integer)
 image_height_px=H                      # in pixels (integer)
 resolution=R                           # in pixels/inch

  image_width_in_inch=$((W / R))        #   Shell arithmetics: does only handle
 image_height_in_inch=$((H / R))        #+  and return integers!

  image_width_in_mm=$(( $((W / R)) * 254/10 ))
 image_height_in_mm=$(( $((H / R)) * 254/10 ))

 # use 'bc' to achieve higher precision arithmetics:
  precise_image_width_in_mm=$( echo \
                               "$image_width_px  / $resolution * 25.4" \
                               | bc -l )
 precise_image_height_in_mm=$( echo \
                               "$image_height_px / $resolution * 25.4" \
                               | bc -l )

关于shell - 如何在命令行上以毫米为单位更改图像的打印尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773688/

相关文章:

java - im4Java,改变框架颜色?

r - 将图像对象列表传递给 R magick 函数而不是向量

用于操作和重叠图像的 Java 库

javascript - 如何复制 Google Fastflip 的 UI 功能?

linux - 如何将两个文件中的两行添加到一个命令中?

shell - 如何从 POSIX shell 脚本中删除 root 权限?

php - 如今,最好的 PHP 图像处理器库是什么?

html - 如何从终端触发 url

C中的cd命令用法

Android可绘制资源: Dynamically change an icon color/"background"?