如何使用命令行(ImageMagick)将图像变为正方形并用透明填充边缘

15

有关 方形填充或裁剪 的部分描述了一种方法来生成一个正方形的图像 - 对于其尺寸未知的文件,并用颜色填充背景。

我如何执行相同的操作,但创建一个透明背景。


我看到你在我回答问题一个小时后发表了评论,但你没有对我的回答发表评论。它没有达到你想要的效果吗? - Bonzo
1
我刚错过了它。你的解决方案正是我在寻找的(我刚刚标记了它)。谢谢! - bwv549
这很好;有时候我会感到困惑,因为答案的顺序似乎会改变。 - Bonzo
3个回答

28

首先,让我们制作一张300x200的红色非正方形图片:

convert -size 300x200 xc:red image.png

输入图像描述的位置

现在让我们制作一个正方形的图像,但使用黄色背景以便您可以看到它:

convert -background yellow -gravity center image.png -resize 400x400 -extent 400x400 result.png

enter image description here

现在我们可以再次做同样的事情,但是让背景透明:

convert -background none -gravity center image.png -resize 400x400 -extent 400x400 result.png

输入图像描述

最后,检查一下是否已经生效:

identify result.png
result.png PNG 400x400 400x400+0+0 8-bit sRGB 418B 0.000u 0:00.000

1
这个回答很有用,但问题特别是关于那些事先尺寸未知的图像。 - bwv549
1
@bmv549 嗯?不需要知道尺寸,我只是放了一些进去,这样你就可以看到一些东西。你只需要知道你想要的输出图像的大小,所以如果你想要400x400,你把这些数字放进去,得到400x400 - 它完全不依赖于知道原始图像的大小。只需执行 convert -background none -gravity center image.png -resize 400x400 -extent 400x400 result.png,它可以在不考虑输入大小的情况下工作。 - Mark Setchell
@bmv549 哦,我现在明白了 - 从阅读其他答案中。你的问题只是说你想要一个正方形的图像(这就是我的答案产生的),但不是边必须是原始图像较长边的长度。无论如何,我还是会留下它 - 这可能会帮助其他人。 - Mark Setchell
是的,你的解决方案非常适合我认为比较常见的情况(即,当你想要一个特定的输出文件大小时)。谢谢! - bwv549

3
这些改进后的Anthony示例的方法都对我有效:
  convert thumbnail.gif \
      \( +clone -rotate 90 +clone -mosaic +level-colors grey -transparent grey \) \
      +swap -gravity center -composite    square_padded.gif

convert thumbnail.gif  -virtual-pixel none -set option:distort:viewport \
 "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
 -filter point -distort SRT 0  +repage  square_external.gif

1
一个纯imagemagick命令会更好,但是这里有一个使用unix/linux命令'file'来提取文件尺寸的脚本,然后可以用于将其调整为最大维度的正方形。
#!/usr/bin/env ruby

require 'shellwords'

def dims(image_escaped)
  size_data = `file #{image_escaped}`
  size_data[/, (\d+ x \d+),/, 1].split(' x ').map(&:to_i)
end

def square(image, pad_color='transparent')
  image_esc = Shellwords.escape(image)

  maxdim = dims(image_esc).max
  geometry = "#{maxdim}x#{maxdim}"

  # could use convert if don't want to clobber the image
  system "mogrify -resize #{geometry} -background #{pad_color} -gravity center -extent #{geometry} -format png #{image_esc}"
end

ARGV.each do |image|
  square(image)
end

Bonzo的回答比这个更好,但我会保留这个记录。 - bwv549

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