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

时间:2012-07-30 11:42:07

标签: php imagemagick

我正在使用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 个答案:

答案 0 :(得分:46)

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


原始图片的尺寸为:

489 x 640 pixels

您想要的尺寸似乎是:

290 x 310 pixels

如果没有:

,则无法扩展到这些尺寸
  1. 裁剪(不要保留初始图像的所有区域)
  2. 保持所需宽度(放弃所需高度)
  3. 保持所需的高度(放弃所需的宽度)
  4. 失真(缩放时不保持纵横比)
  5. 填充(向一个或多个边添加更多像素)
  6. 删除不明显的像素(“液体重新缩放”或“缝线雕刻” - see Wikipedia
  7. 您的结果显示'1' (裁剪),你不喜欢。所以你有两个选项'2' (保持宽度),'3' (保持身高),'4' (扭曲),'5' (填充)和'6.' (缝雕)留下来测试。

    '2。':保持所需的高度

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

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

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

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

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

    '4。':失真

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

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

    '5。':填充

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

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

    '6。':Seam Carving

    <击>

    <击>
    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 gone wrong liquid-rescale gone wrong

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

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

答案 1 :(得分:5)

尝试:

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

希望有所帮助