【问题标题】:draw grid with cells of specific size over an image在图像上使用特定大小的单元格绘制网格
【发布时间】:2018-07-15 21:02:31
【问题描述】:

如何在图像上绘制一个 1px 黑色边框不填充的网格?

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

例如,给定这个 1440x1080 像素的纯白色输入:

它应该有一个 3x3 的网格(因为它可以容纳 9 个 480x360px 的矩形)以使输出如下所示:

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

【问题讨论】:

  • 你可以在 ImageMagick 中使用 -draw "line ... " 函数来做到这一点。如果在 Unix imagemagick 系统上,你也许可以使用我的 bash unix shell 脚本,grid。见fmwconcepts.com/imagemagick/index.php

标签: image macos imagemagick zsh imagemagick-convert


【解决方案1】:

我对此进行了一些尝试,但每次都受到阻碍。这是迄今为止我得到的最好的。

convert xc:white[1440x1080\!] -colorspace gray -fx "(i==0||i==479||i==959||i==1439||j==0||j==359||j==719||j==1079)?0:1" grid.png

因此,为了实际使用,您可以获取雪景并对其进行克隆。然后转到灰度(将处理时间减少 3 倍)并将所有线条设置为黑色,将其他像素设置为白色。然后覆盖到雪景上,选择每个位置最暗的像素:

convert scene.jpg \( +clone -colorspace gray \
   -fx "(i==0||i==479||i==959||i==1439||j==0||j==359||j==719||j==1079)?0:1" \) -compose darken -composite result.png


如果您希望它稍微更智能并适应不同大小的图像,您可以根据图像大小计算第三点:

magick scene.jpg \( +clone -colorspace gray \
  -fx "(i==0||i==int(w/3)||i==2*int(w/3)||i==w-1||j==0||j==int(h/3)||j==2*int(h/3)||j==h-1)?0:1" \) \
  -compose darken -composite result.png

【讨论】:

  • 不错!我需要一个大小为 w x h 的常规网格,并使用 -fx "(i%w==0||j%h==0)?0:1" 来实现。谢谢。帮了大忙。
【解决方案2】:

这是一个命令,它将读取输入图像,创建一个带有黑色边框的 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

这将使网格线的粗细为 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

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

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

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

显然使用这种方法,如果输入图像不能被单元格的数量平均划分,则单元格可能不具有完全相同的尺寸。

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

convert "$infile" -background black -bordercolor black \
   -crop 480x360 -chop 1x1 -splice 1x1 -flatten -shave 1x1 -border 1x1 output.png

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

convert "$infile" -background black -bordercolor black \
   -crop 3x3@ -chop 1x1 -splice 1x1 -flatten -shave 1x1 -border 1x1 output.png

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

【讨论】:

  • 甜蜜!不错的方法!
【解决方案3】:

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

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

但这都是手动的。

有没有办法实现自动化?

【讨论】:

  • 这里已经发布了几个回复和建议。一些成员已经付出了很多努力来帮助您解决问题。你对他们中的任何一个都没有任何 cmet 吗?
  • @GeeMack 他们太慢了,所以我按照我在这个答案中写的那样手动完成了,从那以后就不需要这样做了。当我下次需要这样做时,我会测试他们的方法,这看起来确实更好,但是 b/c 我没有测试任何我觉得我不能接受任何方法
  • 好的,所以您的评论“有没有办法自动执行此操作?”并不是真正的回复请求。问号让我们上当了。
  • @GeeMack 不,这是一个问题。下次我需要做这个任务时,我将能够更轻松、更快地完成它,因为我自己提供了所有有用的答案,而且我也学到了很多关于 imagemagick 功能的知识。
【解决方案4】:

这是另一个快速且易于理解的变体 - 不是 100% 符合您的要求,但可能已经足够好了。

创建一个带有黑色边框的起始框,复制两次并附加到整个页面,复制两次并附加到页面下方,对大小进行小幅修正:

convert xc:red[478x358\!] -bordercolor black -border 1  \
  -duplicate 2,0 +smush -1                              \
  -duplicate 2,0 -smush -1 -transparent red -scale 1440x1080\! result.png

【讨论】:

    【解决方案5】:

    或者你可以制作你的初始盒子,复制 8 次,然后让montage 放置生成的 9 个盒子:

    convert xc:red[478x358\!] -bordercolor black -border 1 \
       -transparent red -duplicate 8,0 miff:- | montage -background none -geometry +0+0 miff:- result.png
    

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多