仅当背景为白色或透明时,才使用imagemagick为图像添加填充

Jos*_*shL 3 imagemagick

我正在处理图片库应用程序,因此我们需要有条件地在具有白色或透明背景的图像周围添加填充,以使它们在我们页面的网格内看起来正常。

基本上,我们需要:

  1. 检查图像是否为白色或透明背景
  2. 如果是,请在图像周围添加5px透明边框。
  3. 如果否,则什么也不做。

有没有办法在一两行中使用ImageMagick做到这一点,还是我们需要使用其他库?

Mar*_*ell 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
Run Code Online (Sandbox Code Playgroud)

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

您可以使用Imageagick的trim功能修剪任何实线或透明边框,如下所示:

convert input.jpg -trim +repage output.jpg
Run Code Online (Sandbox Code Playgroud)

如果没有实线边框,则不执行任何操作。该+repage重置图片,使其不再记得它的更大的东西一部分在画布周围。

或者,您可以使用 mogrify

mogrify -fuzz 15% -trim +repage *.jpg
Run Code Online (Sandbox Code Playgroud)

fuzz因素允许边框颜色略有变化,同时仍对其进行修整。

可以同时使用以下命令添加新边框:

convert input.jpg -fuzz 10% -trim +repage -bordercolor white -border 5x5 output.jpg
Run Code Online (Sandbox Code Playgroud)

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

convert input.png -format "%[pixel:s.p{0,0}]" info:
Run Code Online (Sandbox Code Playgroud)

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

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

graya(0,0)
Run Code Online (Sandbox Code Playgroud)

还有一个白色的:

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

gray(255)
Run Code Online (Sandbox Code Playgroud)

还有一个红色的:

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

red
Run Code Online (Sandbox Code Playgroud)