Linux 如何为图像添加边框,使其大小可被4整除

Linux 如何为图像添加边框,使其大小可被4整除,linux,bash,imagemagick,Linux,Bash,Imagemagick,我尝试使用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_he

我尝试使用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

最后的
页面高度
页面宽度
预计可被4整除,但宽度为奇数。我的方法有什么问题?

我认为错误是计算出的边框大小增加了一倍。 假设页面宽度=1,然后边框宽度=43,最后一页宽度=1+2*43=87

如果希望两边的边界为~40,则可能需要以下条件:

border_x=$((4-(页宽%4)+2*40))
边框y=$((4-(页高%4)+2*40))
页码高度=$((页码高度+边框y))
页宽=$((页宽+边框)

与其计算每侧边框的宽度并调整大小和填充,通常更容易计算边框图像的总大小,设置背景颜色并将图像范围更改为新大小。假设我从这幅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


如果您有一个较旧的ImageMagickv6版本不喜欢做数学运算,您可以让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
border=40
#使用bash“进程替换”一次性获得宽度和高度

阅读w h<您不会显示如何添加边框!您的代码意味着您正在调整图像的大小(因为您计算了新的宽度和高度),但您需要
在新尺寸之后,否则将在保持纵横比的同时调整尺寸。显示你的代码,我会提供帮助。当边框被添加到图像中时,它们被添加到两个面上,因此根据你的代码83将被添加到1=>最后的宽度=2*83+1,这又是一个奇数。@艾哈迈德请查看解决方案:假设页面宽度=1,然后边框宽度=83,最后的页面宽度=1+83=84。是的,调整大小可以解决问题,但是我问我是否可以用边界来做,这并不容易,因为边界是在两边添加的。@Ahmad你最初的问题是“我试图用ImageMagic为图像添加边界,使其尺寸可以被4整除。最后的
页面高度
页面宽度
预计可被4整除,但宽度为奇数。我的方法有什么问题。我相信这个解决方案说明了问题所在。如果您还有其他后续问题,请澄清。谢谢。在添加边框后计算页面宽度时,您编写了
page\u width=$((page\u width+border\u x))
,这是不正确的。它必须是
page\u width=$((page\u width+2*border\u x))
。为什么?因为在使用命令
border
后,边框被添加到两侧!因此,生成的
页面宽度
就是我写的。但是,如果您使用
调整大小
它可以工作,但我的问题是关于边界。事实上,我自己通过添加第一个边框然后调整大小来解决问题。另一个答案是使用
extent
,这也是一个解决方案。我还考虑过在添加边框后调整大小。我只是不知道你的代码是否保证宽度可以被4整除?请相信
w%4
告诉你除以4后剩下的是什么,所以如果你从
w
中减去它,你将四舍五入到最接近的4。在一些不同大小的图像上尝试。