Imagemagick - 包含裁剪中的图像

时间:2014-04-29 16:54:32

标签: php image-processing imagemagick

我不经常使用Imagemagick,这就是为什么我不知道如何解决这个问题。除了以下问题之外,我也不知道如何表达问题:如何像CSS属性一样裁剪图像:background-size:contains;我还没能找到答案,可能是因为我的措辞。

我需要图片为200px,并且"调整大小/裁剪"这样它就不会被拉伸,而是被宽度或高度所包含(取决于图像的方向width > height = contain by width

到目前为止我所拥有的:

$im = new Imagick($path);

/* Resizing Operations */

$gm = $im->getImageGeometry();
$w = $gm['width'];
$h = $gm['height'];

if($h < $w) {
    $nh = 200;
    $nw = (200 / $h) * $w;
} else {
    $nw = 200;
    $nh = (200 / $w) * $h;
}

$im->resizeImage($nw, $nh, Imagick::FILTER_LANCZOS, true);
$im->cropThumbnailImage(200,200);

/* End Resizing Operations */

生成中心被切断的图像。

这是一个直观的例子

我们有这个标志:

Original Logo


然后我们希望它被限制在200px宽和200px高,包含:

resized

基本上就像设置画布高度,而不是调整图像高度。

2 个答案:

答案 0 :(得分:1)

基于ImageMagick的范围方法提出了这种算法,它实现了与CSS background-size: contain;

相同的结果

您可以在resizeImage函数中设置200值以获取最终产品。工作得很漂亮!

$im = new Imagick($path);

/* Resizing Operations */
$gm = $im->getImageGeometry();
$w = $gm['width'];
$h = $gm['height'];

if($h < $w) {
    $sr = $w;
    $horz = TRUE;
} else if($h > $w) {
    $sr = $h;
    $horz = FALSE;
} else {
    $square = TRUE;
}

if(!$square && $horz) {
    $srs = $sr / 2;
    $extent_amt = $srs - ($h / 2);
    $im->extentImage($sr, $sr, 0, 0 - $extent_amt);
} else if(!$square && !$horz) {
    $srs = $sr / 2;
    $extent_amt = $srs - ($w / 2);
    $im->extentImage($sr, $sr, 0 - $extent_amt, 0);
}

$im->resizeImage(200, 200, Imagick::FILTER_LANCZOS, true);

/* End Resizing Operations */

$im->writeImage($path);

/* Clean up time */
$im->clear();
$im->destroy();

答案 1 :(得分:0)

这似乎对你有用,因为它的运行方式与background-size:contain;在CSS中的工作方式相同

$path = __DIR__ . '/img.jpg';
$im = new Imagick($path);

$gm = $im->getImageGeometry();
$w = $gm['width'];
$h = $gm['height'];

if ($w >= $h) {
    $target_height = 0;
    $target_width = 200;
} elseif ($h > $w) {
    $target_height = 200;
    $target_width = 0;
}

$im->resizeImage($target_width, $target_height, Imagick::FILTER_LANCZOS, true);

$im->writeImage($path);
$im->clear();
$im->destroy();