【问题标题】:How to add borders to an image so that its size be divisible by 4如何为图像添加边框,使其大小可被 4 整除
【发布时间】:2020-03-29 05:07:38
【问题描述】:

我尝试使用 ImageMagic 为图像添加边框,使其尺寸可被 4 整除。我写道:

image_files=( "$alldir"/*.png )

current="${image_files[0]}"
page_height=$(identify -format "%h" $current)
page_width=$(identify -format "%w" $current)

border_x=$((4-(page_width%4) + 40))
border_y=$((4-(page_height%4) + 40))

使用border 命令后,我会:

page_height= page_height + 2*border_y
page_width= page_width + 2*border_x

最后的 page_heightpage_width 预计可以被 4 整除,但宽度是奇数。我的方法有什么问题?

【问题讨论】:

  • 你没有展示你是如何尝试添加边框的!您的代码暗示您正在调整图像的大小(因为您计算了新的宽度和高度),但在新大小之后您将需要 ! ,否则它将在保持纵横比的同时调整大小。显示您的代码,我会提供帮助。

标签: linux bash imagemagick


【解决方案1】:

与计算每边边框的宽度并调整大小和填充相比,计算边框图像的总大小、设置背景颜色并将图像的范围更改为新大小通常更容易。所以,假设我从这张 181x149 像素的图像开始:

现在,我想要一个 40 像素的边框,所以我设置了一个 shell 变量:

border=40

然后我可以像这样在黄色背景上居中图像:

magick input.png -background yellow -gravity center -extent "%[fx:w-w%4+2*$border]x%[fx:h-h%4+2*$border]" +repage result.png


如果您有一个不喜欢做数学运算的旧 ImageMagick v6 版本,您可以让您的 shell 来做:

border=40
# Get width and height in one go with a bash "process substitution"
read w h < <(identify -format "%w %h" input.png)
convert input.png -background yellow -gravity center -extent "$((w-w%4+2*$border))x$((h-h%4+2*$border))" +repage result.png

【讨论】:

  • 我还考虑在添加边框后调整大小。我只是不知道你的代码是否保证宽度可以被 4 整除?
  • 相信! :-) w%4 告诉你除以 4 后剩下的内容,所以如果你从 w 中减去它,你将向下舍入到最接近的 4。在一些不同尺寸的图像上尝试一下。
【解决方案2】:

我认为错误是计算出的边框大小加倍。 说page_width=1,然后border_x=43,最后的page_width=1+2*43=87

如果您想要两边都有约 40 的边框,您可能需要以下内容:

border_x=$((4-(page_width%4) + 2*40))
border_y=$((4-(page_height%4) + 2*40))

page_height=$((page_height + border_y))
page_width=$((page_width + border_x))

【讨论】:

  • 当边框添加到图像时,它们会添加到两侧,因此根据您的代码,83 将添加到 1 => 最终宽度 = 2*83+1,这又是一个奇数.
  • @Ahmad 请查看解决方案:说 page_width=1,然后是 border_x=83,最后是 page_width=1+83=84。
  • 是的,调整大小可以解决问题,但是我问我是否可以用边框来做,这并不容易,因为边框是两边都加的。
  • @Ahmad 您最初的问题是“我尝试使用 ImageMagic 为图像添加边框以使其尺寸可被 4 整除。最终的 page_heightpage_width 预计可被 4 整除,但宽度是奇数。我的方法有什么问题?我相信解决方案表明问题出在哪里。如果您还有其他后续问题,请澄清。谢谢。
  • 添加边框后计算page_width时,您写了page_width=$((page_width + border_x)),这是不正确的。它必须是page_width=$((page_width + 2*border_x))。为什么?因为使用命令border 后,在两侧添加了边框!所以得到的page_width 就是我写的。但是,如果您使用 resize 它可以工作,但我的问题是关于边界的。事实上,我自己通过添加第一个边框然后调整它的大小来解决我的问题。使用extent 的另一个答案也是一个解决方案。
猜你喜欢
  • 2018-09-03
  • 2016-09-25
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多