Imagemagick裁剪命令没有给出完美的结果

Muh*_*air 8 php imagemagick

我正在使用imagemagick来调整图像大小和裁剪图像.

测试图像:

在此输入图像描述

我需要重新调整它的尺寸为300 x 320帧,我首先调整图像然后裁剪它,我使用以下命令:

exec("convert /uploadImagePath -thumbnail  300  /newImagePath");

exec("convert /newImagePath -gravity Center -crop 290x310+0+0 /newImagePath");
Run Code Online (Sandbox Code Playgroud)

但它给了我以下图像

在此输入图像描述

你可以看到图像不完整...请帮我错误

Kur*_*fle 48

(答案已更新,现在提供-liquid-rescale下面进一步说明的示例)


您原始图片的尺寸为:

489 x 640 pixels
Run Code Online (Sandbox Code Playgroud)

您想要的尺寸似乎是:

290 x 310 pixels
Run Code Online (Sandbox Code Playgroud)

如果没有:

  1. 裁剪(不要保留初始图像的所有区域)
  2. 保持所需的宽度(放弃所需的高度)
  3. 保持所需的高度(放弃所需的宽度)
  4. 失真(缩放时不保持纵横比)
  5. 填充(向一个或多个边添加更多像素)
  6. 去除不明显的像素("液体重新缩放"或"缝缝" - 见维基百科)

你的结果显示'1' (裁剪),你不喜欢.所以你有两个选项'2' (保持宽度),'3' (保持身高),'4' (扭曲),'5' (填充)和'6.' (缝雕)留下来测试.

'2.':保持理想的高度

convert WPTgp.jpg -resize x310 keep-height.jpg
Run Code Online (Sandbox Code Playgroud)

结果图像的尺寸为237 x 310 pixels.
Keep Height.... 保持高度
(自动确定宽度)

'3.':保持所需的宽度

convert WPTgp.jpg -resize 290x keep-width.jpg
Run Code Online (Sandbox Code Playgroud)

结果图像的尺寸为290 x 380 pixels.
Keep Width..... 保持宽度
(自动确定高度)

'4.':失真

convert WPTgp.jpg -resize 290x310\! distorted.jpg
Run Code Online (Sandbox Code Playgroud)

结果图像的尺寸为290 x 310 pixels.
Distorted...... 扭曲
(忽略纵横比 - 如果需要适合尺寸,则扭曲图像)

'5.':填充

convert WPTgp.jpg \
   -resize 290x310 \
   -gravity center \
   -background orange \
   -extent 290x310 \
    padded.jpg
Run Code Online (Sandbox Code Playgroud)

结果图像的尺寸为290 x 310 pixels.(添加橙色背景只是为了证明图像的"延伸"确实有效.)
Padded......... 加厚
(保持纵横比 - 扩展所需尺寸的图像)

'6.':Seam Carving

convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg
Run Code Online (Sandbox Code Playgroud)

以上将是您从快速阅读ImageMagick命令选项参考中自发获得的命令.但是,它不能很好地工作,而是使用了:

convert WPTgp.jpg -liquid-rescale 599x640\! -scale 290x310 liquid.jpg
convert WPTgp.jpg -liquid-rescale 599x640\! -scale 48.4%   liquid.jpg
Run Code Online (Sandbox Code Playgroud)

下面是我需要修改它的原因....
Liquid-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
Run Code Online (Sandbox Code Playgroud)

请记住,我们有一个489x610像素的原始图像,我们预计可以缩放到290x310像素.但是-liquid-rescale不擅长同时在两个维度上重新缩放 - 它被设计为仅缩放到一个方向(水平或垂直).如果你试图同时做两件事,结果可能不是你所期望的.这是最初提出的命令的结果:

 convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg
Run Code Online (Sandbox Code Playgroud)

LQR gone wrong 液体重塑出错了

这就是为什么我想出了两个修改过的命令,它们分两步工作:

  1. 首先,仅将液体重新缩放应用于水平尺寸,将原始宽度从489像素扩展到599像素.
  2. 其次,将"正常"宽高比保持缩放应用于中间结果以产生最终图像.

  • @MuhammadUmair:但是你不接受这个答案? (14认同)
  • @MuhammadUmair请接受这个精心设计的答案 (2认同)

Sud*_*oti 3

尝试:

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

希望有所帮助

  • @Muhammad Umair:老实说,我不明白为什么这是公认的答案.**它不能按照要求**工作**它确实裁剪图像**,并且非常糟糕! (3认同)