Imagemagick裁剪命令未能给出完美结果

8
我正在使用Imagemagick来调整大小和裁剪图像。
测试图片: enter image description here 我需要将其调整为300 x 320框架,因此首先我正在调整图像大小,然后裁剪它并使用以下命令:
exec("convert /uploadImagePath -thumbnail  300  /newImagePath");

exec("convert /newImagePath -gravity Center -crop 290x310+0+0 /newImagePath");

但是它给我以下图片: enter image description here 如您所见,图片不完整。我错在哪里了?
2个回答

52

(回答已更新,下面提供了-liquid-rescale的图示示例)


您原始图片的尺寸为:

489 x 640 pixels

您所需的尺寸似乎是:

290 x 310 pixels

如果不进行以下操作之一,就无法将其缩放到这些尺寸:

  1. 裁剪(不保留初始图像的所有区域)
  2. 保持所需宽度(放弃所需高度)
  3. 保持所需高度(放弃所需宽度)
  4. 失真(缩放时不保持纵横比)
  5. 填充(在一个或多个边缘添加更多像素)
  6. 删除不明显的像素("液态调整"或"缝合雕刻" — 见维基百科

您的结果显示了“1.”(裁剪),您不喜欢。因此,您还可以测试“2.”(保持宽度)、“3.”(保持高度)、“4.”(失真)、“5.”(填充)和“6.”(缝合雕刻)等选项。

'2.':保持所需高度

convert WPTgp.jpg -resize x310 keep-height.jpg

生成的图像尺寸为237 x 310像素
保持高度... 保持高度
(自动确定宽度)

'3.': 保持所需宽度

convert WPTgp.jpg -resize 290x keep-width.jpg

生成的图像尺寸为290 x 380 像素
保持宽度..... 保持宽度
(自动确定高度)

'4.': 畸变

convert WPTgp.jpg -resize 290x310\! distorted.jpg

生成的图像尺寸为290 x 310像素
扭曲...... 扭曲
(忽略纵横比-如有必要,可扭曲图像以适应尺寸)

'5.': 填充

convert WPTgp.jpg \
   -resize 290x310 \
   -gravity center \
   -background orange \
   -extent 290x310 \
    padded.jpg

生成的图像尺寸为290 x 310像素。(橙色背景仅用于演示图像的“扩展”已经起作用。)
填充......... 填充
(保持长宽比--扩展图像以达到所需尺寸)

'6.': 接缝剪裁

convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg

上述命令是你从快速阅读ImageMagick命令选项参考手册中推导出的。然而,它并不有效,相反我使用了:

convert WPTgp.jpg -liquid-rescale 599x640\! -scale 290x310 liquid.jpg
convert WPTgp.jpg -liquid-rescale 599x640\! -scale 48.4%   liquid.jpg

以下是我需要修改它的原因的解释...
Liquid-rescaled 'Liquidly' rescaled
抱歉 - 我现在无法提供示例图片;这需要安装额外的ImageMagick代理liblqr(液态缩放库),而我目前没有安装) 现在我有机会创建原始图像的“液态缩放”版本。


关于Seam Carving / '-liquid-rescale'的注意事项:

如上所述,最后的图像不是我最初建议的命令结果,而是这两个修改版本之一:

convert WPTgp.jpg -liquid-rescale 599x640\! -scale 290x310 liquid.jpg
convert WPTgp.jpg -liquid-rescale 599x640\! -scale 48.4%   liquid.jpg

请记住,我们有一张原始图像大小为489x610像素,需要缩放到290x310像素。但是-liquid-rescale不擅长同时在两个维度上进行缩放--它只能在一个方向上进行缩放(水平或垂直)。如果您尝试同时进行两个方向的缩放,结果可能不如您所期望。以下是最初建议的命令的结果:

 convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg
LQR出现问题 liquid-rescale gone wrong

这就是我提出的两个修改后的命令,分为两步:

  1. 首先,仅对水平维度应用液体缩放,将原始图像的宽度从489像素扩展到599像素。
  2. 其次,对中间结果应用“正常”的宽高比保持缩放以生成最终图像。

2
@MuhammadUmair 请接受这个精心制作的答案。 - Airy

3

尝试:

$inputFile = "WPTgp.jpg";
exec("convert {$inputFile} -resize 290x310^ -gravity Center -crop 290x310+0+0 picCropped.png");

我在本地机器上安装了ImageMagick 6.7.6-9,并且以上命令给出了完美的结果,但是当我将其上传到安装有ImageMagick 6.6.0-4版本的服务器时,结果与本地机器不同。有任何想法吗? - Muhammad Umair
3
@Muhammad Umair:老实说,我真的不明白为什么这个答案被接受了。它并没有按照问题所要求的方式工作--它确实裁剪了图像,而且做得非常糟糕! - Kurt Pfeifle

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