通过指定新的纵横比来拟合图像

Posted

技术标签:

【中文标题】通过指定新的纵横比来拟合图像【英文标题】:Fitting images by specifying the new aspect ratio 【发布时间】:2014-03-10 04:56:58 【问题描述】:

ImageMagick 的convert 能否在指定纵横比后附加白条或黑条以保持纵横比?

更具体的

假设我有一个 2000x1000 的广角图像,我想计算一个宽高比为 4:3 的新图像以适应电视,例如电视。我可以的

convert input.png -background black -extent 2000x1500 -gravity center output.jpg

但在这里我手动选择了 2000x1500 来生成额外的 250x2 像素的 blakc。可以问convert

    将纵横比更改为 4:3 不丢失任何像素;不插入任何像素 居中图像

?

如果也可以选择背景颜色作为图像中的主要颜色(如在 iTunes 11 中),请提及如何。

【问题讨论】:

【参考方案1】:

Convert 没有将图像填充到给定纵横比的内置功能,因此您需要编写脚本。这是在 bash 中如何完成的:

#!/bin/bash -e

im="$1"
targetaspect="$2"

read W H <<< $(identify -ping -format "%w %h" "$im")
curaspect=$(bc <<< "scale=10; $W / $H")

echo "current-aspect: $curaspect; target-aspect: $targetaspect"

comparison=$(bc <<< "$curaspect > $targetaspect")
if [[ "$comparison" = "1" ]]; then
    targeth=$(bc <<< "scale=10; $W / $targetaspect")
    targetextent="$Wx$targeth%.*"
else
    targetw=$(bc <<< "scale=10; $H * $targetaspect")
    targetextent="$targetw%.*x$H"
fi

echo convert "$im" -background black \
    -gravity center -extent "$targetextent" \
    output.jpg

调用此脚本,输入图像和目标纵横比为浮点数(例如,4/3 = 1.333):

$ do-aspect input.png 1.333

注意事项:

bc 用于浮点运算,因为 bash 本身只有整数运算。 注意-gravity center 位于-extent 之前的最后一个命令行上。这是因为重力是一个设置,而范围是一个运算符。设置应始终先于它们影响的运算符,否则当您的命令开始变得更复杂时,convert 会做出意想不到的事情。 当您对程序的结果感到满意时,您可以复制并执行它的输出,或者只删除最终 convert 之前的 echo

对于您关于查找图像主色的问题,有不同的方法可以做到这一点,但一种常见的方法是将图像大小调整为 1x1 并输出结果像素的颜色 - 这将是平均颜色全图:

convert input.png -resize 1x1 -format '%[pixel:p[0,0]]' info:

您可以在调整大小之前对图像进行其他处理以获得不同的启发式。

【讨论】:

以上是关于通过指定新的纵横比来拟合图像的主要内容,如果未能解决你的问题,请参考以下文章

通过保持纵横比和宽度调整 UIImage 的大小

如何在保持纵横比的矩形内放置 30 张图像

openGl 重塑函数

如何在 R 中拟合分段回归,并限制第一次拟合通过截距..?

调整UIImageView的大小以包装“适合方面”的图像

React-Native Dimensions 获取高度不准确解决