在图像上绘制具有特定大小的单元格的网格

the*_*sti 6 macos zsh image imagemagick imagemagick-convert

如何在图像上绘制网格、1px 黑色边框、无填充?

网格的每个部分应为 480x360 像素。

例如,给定 1440x1080px 纯白色输入:

在此输入图像描述

它应该有一个 3x3 网格绘制在其上(因为 9 480x360px 矩形适合它)以产生如下所示的输出:

在此输入图像描述

这并不像我希望的命令那么准确(我只是用眼睛绘制矩形),但我希望它能说明我所追求的内容。

Gee*_*ack 5

这是一个命令,它将读取输入图像,创建带有黑色边框的 480x360 透明单元格,创建这些单元格的输入图像大小的网格,并将该网格合成在输入上......

infile="MyPic.png"

convert "$infile" -size 480x360 -set option:distort:viewport "%[w]x%[h]" \
   \( xc:none -shave 1x1 -compose copy -bordercolor black -border 1x1 \) \
   -virtual-pixel tile -distort SRT 0 -compose over -composite output.png
Run Code Online (Sandbox Code Playgroud)

这将使网格线的厚度变为 2 像素。如果线条必须为 1 像素粗,则可以使用如下命令完成相同的操作...

convert "$infile" -size 480x360 -set option:distort:viewport "%[w]x%[h]" \
   \( xc:none -chop 1x1 -background black -splice 1x1 \) \
   -virtual-pixel tile -distort SRT 0 -compose over -composite \
   -bordercolor black -shave 1x1 -compose copy -border 1x1 output.png
Run Code Online (Sandbox Code Playgroud)

编辑添加:如果目标是将网格划分为特定数量的单元格而不是指定尺寸的单元格,则像这样的命令应该起作用......

convert "$infile" \( +clone -channel A -evaluate set 0 +channel \
  -crop 3x4@ -chop 1x1 -background black -splice 1x1 \) -background none \
  -flatten -shave 1x1 -bordercolor black -border 1x1  output.png
Run Code Online (Sandbox Code Playgroud)

这将创建输入图像的克隆并使其透明,使用“-crop 3x4@”将其裁剪为 3x4 单元格的网格,在单元格的顶部和左侧边缘放置黑色边框,然后将它们重新组装成网格通过将它们展平到输入图像上。最后,它在右边缘和下边缘添加边框,同时保留输入图像的原始尺寸。

显然,如果输入图像不能除以单元格数量,则使用此方法,单元格可能不会全部具有完全相同的尺寸。

再次编辑:如果您实际上不需要网格作为叠加层,则可以直接将图像裁剪为图块,在图块周围放置黑线,然后重新组合它们以创建所需的输出图像。这可以通过像这样的简单命令来完成,以制作 480x360 大小的单元格......

convert "$infile" -background black -bordercolor black \
   -crop 480x360 -chop 1x1 -splice 1x1 -flatten -shave 1x1 -border 1x1 output.png
Run Code Online (Sandbox Code Playgroud)

或者可以使用“-crop 3x3@”来完成,就像这样制作一个 3 行 3 列的网格,让 ImageMagick 尽可能计算大小......

convert "$infile" -background black -bordercolor black \
   -crop 3x3@ -chop 1x1 -splice 1x1 -flatten -shave 1x1 -border 1x1 output.png
Run Code Online (Sandbox Code Playgroud)

同样,如果图像大小不能被单元格数量整除,则某些单元格的大小将存在 1 个像素的差异。


the*_*sti 1

到目前为止我想出的最好的:

convert blank.png -fill black -draw 'line 480,0 480,1080 line 960,0 960,1080 line 0,360 1440,360 line 0,720 1440,720' level1.png
Run Code Online (Sandbox Code Playgroud)

但这都是手动的。

有没有办法自动执行此操作?