用想象力环绕形象

时间:2012-12-10 05:32:07

标签: php imagick

尝试拍摄一张矩形照片,将其裁剪成方形区域,然后将其遮盖成一个透明背景的圆形照片。

//$dims is an array with the width, height, x, y of the region in the rectangular image (whose path on disk is $tempfile)

$circle = new \Imagick();
$circle->newImage($dims['w'], $dims['h'], 'none');
$circle->setimageformat('png');
$circle->setimagematte(true);
$draw = new \ImagickDraw();
$draw->setfillcolor('#ffffff');
$draw->circle($dims['w']/2, $dims['h']/2, $dims['w']/2, $dims['w']);
$circle->drawimage($draw);

$imagick = new \Imagick();
$imagick->readImage($tempfile);
$imagick->setImageFormat( "png" );
$imagick->setimagematte(true);
$imagick->cropimage($dims['w'], $dims['h'], $dims['x'], $dims['y']);
$imagick->compositeimage($circle, \Imagick::COMPOSITE_DSTIN, 0, 0);
$imagick->writeImage($tempfile);
$imagick->destroy();

结果是矩形图像,未被切割且没有被环化。我做错了什么?

示例图片: enter image description here

$ dims的示例输入= {“x”:253,“y”:0,“x2”:438.5,“y2”:185.5,“w”:185.5,“h”:185.5}

粗略的预期产出:

enter image description here

图像我的外观大致与输入图像相似。

4 个答案:

答案 0 :(得分:6)

对于那些使用较旧版本的Imagick(版本低于6.2.9不存在setimagematte)的人,我提出了一个简单的解决方案。这里的事情是将遮罩的不透明度复制到原始图像

原始图片:

enter image description here

面膜

enter image description here

结果:

enter image description here

代码:

$base = new Imagick('original.jpg');
$mask = new Imagick('mask.png');

$base->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$base->writeImage('result.png');

你可以使用一个Imagick黑色圆圈作为面具,但我虽然它不完美,所以我使用了自己的。

当然,您肯定必须调整大小/裁剪您的图片,但这是另一个故事。

希望这有帮助。

学家

答案 1 :(得分:3)

Result of the code

这对我有用:

<?php
//$dims is an array with the width, height, x, y of the region in the rectangular image (whose path on disk is $tempfile)
$tempfile = 'VDSlU.jpg';
$outfile = 'blah.png';

$circle = new Imagick();
$circle->newImage(185.5, 185.5, 'none');
$circle->setimageformat('png');
$circle->setimagematte(true);
$draw = new ImagickDraw();
$draw->setfillcolor('#ffffff');
$draw->circle(185.5/2, 185.5/2, 185.5/2, 185.5);
$circle->drawimage($draw);

$imagick = new Imagick();
$imagick->readImage($tempfile);
$imagick->setImageFormat( "png" );
$imagick->setimagematte(true);
$imagick->cropimage(185.5, 185.5, 253, 0);
$imagick->compositeimage($circle, Imagick::COMPOSITE_DSTIN, 0, 0);
$imagick->writeImage($outfile);
$imagick->destroy();
?>

<img src="blah.png">

我总是尽量保持代码简单,直到我开始工作,然后添加所有变量等。这可能是问题,或者你的Imagick版本可能有问题。

  

它是命名空间

仍然不知道这意味着什么! - 我有点落后于PHP,因为这些天我没有使用它。

答案 2 :(得分:1)

当我在为Ruby on Rails寻找类似的解决方案时,我偶然发现了这一点,请注意this Stackoverflow question使用了晕影,这似乎是解决问题的一种更简单的方法。

我用小插图用rounded images in Ruby on Rails using Dragonfly来解决我的问题。

答案 3 :(得分:1)

我还建议另外一种解决方法:

// create an imagick object of your image
$image = new \Imagick('/absolute/path/to/your/image');
// crop square your image from its center (100px witdh/height in my example)
$image->cropThumbnailImage(100, 100);
// then round the corners (0.5x the width and height)
$image->roundCorners(50, 50);
// force the png format for transparency
$image->setImageFormat("png");
// write the new image
$image->writeImage('/absolute/path/to/your/new/image');
// done!

非常感谢所有以前的答案和贡献者引导我使用此代码!

随意测试/评论我的解决方案!