如果图像的背景是白色或透明的,使用ImageMagick为图像添加填充。

3
我正在开发一款图库应用程序,我们需要对具有白色或透明背景的图像进行条件性填充,以便它们在我们页面上的网格中看起来正常。
基本上我们需要:
1.检查图像是否具有白色或透明背景
2.如果是,则在图像周围添加5像素的透明边框。
3.如果不是,则不做任何处理。
是否可以使用 ImageMagick 在一两行中完成此操作,还是我们需要使用其他库?
1个回答

5
以下内容大致可以总结出这些东西的全部内容:

类似于这些内容可能总结了接下来的所有内容:

#!/bin/bash
# By default, do not add border
addborder=0

# Get image geometry to see if IM thinks it has a border
geometry=$(identify -format "%g" "$1")
echo DEBUG: geometry: $geometry

# Ask IM what would happen if we trimmed image
trim=$(convert "$1" -format "%@" info:)
echo DEBUG: trim: $trim

if [ $geometry = $trim ]; then
   echo DEBUG: Image does not have a border
   exit
fi

# Get top-left pixel
topleft=$(convert "$1" -format "%[pixel:s.p{0,0}]" info:)
echo DEBUG: Image has border, border colour is: $topleft

# Decide whether to add border
[ $topleft = "white" ] && addborder=1
[ $topleft = "gray(255)" ] && addborder=1
[ $topleft = "graya(0,0)" ] && addborder=1
[ $topleft = "none"  ] && addborder=1
echo DEBUG:addborder: $addborder

if [ $addborder -eq 1 ]; then
    echo DEBUG: adding border
    convert "$1" -bordercolor none -border 5x5 output.png
fi

其他相关信息和想法...

您可以使用 Imageagick 的 trim 功能来修剪任何实心或透明的边框,例如:

convert input.jpg -trim +repage output.jpg

如果没有实线边框,它不会有任何作用。 + repage 重置了画布以围绕图片,使其不再记得它是更大的一部分。
或者,您可以使用mogrify处理整个目录中的图像。
mogrify -fuzz 15% -trim +repage *.jpg
fuzz因子可以使边框颜色有轻微变化,同时仍然裁剪它。
使用以下方法可以同时添加新的边框:
convert input.jpg -fuzz 10% -trim +repage -bordercolor white -border 5x5 output.jpg

或者,如果您想进行更详细的处理,您可以获取左上角像素,并根据其值决定您想要执行的操作:

convert input.png -format "%[pixel:s.p{0,0}]" info:

让我们创建一个透明的图片并检查我们得到什么:

convert -size 10x10 xc:none input.png
convert input.png -format "%[pixel:s.p{0,0}]" info:

graya(0,0)

还有一个白色的:

convert -size 10x10 xc:white input.png
convert input.png -format "%[pixel:s.p{0,0}]" info:

gray(255)

还有一个红色的:

convert -size 10x10 xc:red input.png
convert input.png -format "%[pixel:s.p{0,0}]" info:

red

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接