我正在尝试使用ImageMagick和PHP在左侧和右侧的图像中修剪可变数量的空白.有谁知道怎么做(也许使用imagemagick以外的东西?)?
这是一个例子.
我有这两个图像:

每个都有一个可变数量的文本,在固定宽度的图像中动态创建.我需要做的是修剪右侧和左侧的背景,使图像像这样:


如果ImageMagick不能这样做,我愿意使用别的东西,但我需要帮助的确切原因,因为我不是一个程序员.谢谢!
这是我当前的代码修剪图像的所有边:
<?php
/* Create the object and read the image in */
$i = '3';
$im = new Imagick("test".$i.".png");
/* Trim the image. */
$im->trimImage(0);
/* Ouput the image */
//header("Content-Type: image/" . $im->getImageFormat());
//echo $im;
/*** Write the trimmed image to disk ***/
$im->writeImage(dirname(__FILE__) . '/test'.$i.'.png');
/*Display Image*/
echo $img = "<img src=\"test".$i.".png\">";
?>
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 19
我认为你ImageMagick的-trim操作员1是在正确的轨道上,但诀窍是让它告诉你如果不实际做它会做什么,然后修改它来做你真正想要的......
因此,要ImageMagick为第一张图像计算修剪框,请执行以下操作:
convert -fuzz 10% image.jpg -format "%@" info:
60x29+21+31
Run Code Online (Sandbox Code Playgroud)
这是一个60x29像素的矩形,从左上角偏移21和31.现在,我们希望将这些值变为bash变量,因此我将IFS(输入字段分隔符)设置为在空格上分割字段,x并且还+标记:
#!/bin/bash
IFS=" x+" read a b c d < <(convert -fuzz 10% image.jpg -format "%@" info:)
echo $a $b $c $d
60 29 21 31
Run Code Online (Sandbox Code Playgroud)
现在我可以忽略它29,31因为我们只对裁剪宽度感兴趣,并且像这样裁剪:
convert image.jpg -crop "${a}x+${c}+0" out.jpg
Run Code Online (Sandbox Code Playgroud)
所以,对于你的2张图片,我得到了这些:

完整的程序是这样的:
#!/bin/bash
IFS=" x+" read a b c d < <(convert -fuzz 10% image.jpg -format "%@" info:)
convert image.jpg -crop "${a}x+${c}+0" out.jpg
Run Code Online (Sandbox Code Playgroud)
笔记
1)这-format %@只是-trim操作员的简写,这将是完整的
convert image.jpg -trim info:
image.jpg JPEG 72x40 200x100+16+24 8-bit sRGB 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
从我在有关裁剪和边框的ImageMagick文档中可以看到,这似乎是不可能的。
您不能为“智能”裁切指定一条边(-trim在命令行上称为),并且所有接受几何参数的裁切方法都需要使用固定编号进行裁切。
想到的唯一想法是,在单独的调用中获得剃光区域的颜色,运行trimImage并使用来添加丢失的区域-border。
编辑: IM手册建议类似的东西。查看仅修剪图像的一侧。我对IM的PHP扩展(将代码转换为PHP调用)并不熟悉,但它应该是半途而废的。
基于GD的库WideImage有类似的东西.它被称为autoCrop,默认情况下它适用于所有四个方面.
但是,您可以添加另一个参数,并根据它仅裁剪上/下或左/右.
它有很好的记录.$img是一种WideImage_Image类型.还有一个互动的在线演示.
相关问题:删除视频缩略图中的黑条.
| 归档时间: |
|
| 查看次数: |
10378 次 |
| 最近记录: |