0

長方形の写真を撮り、それを正方形の領域にトリミングしてから、背景が透明な円形にマスクしようとしています。

//$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();

結果は、切り取られておらず、円形化されていない長方形の画像です。私は何を間違っていますか?

画像例: ここに画像の説明を入力

$dims = {"x":253,"y":0,"x2":438.5,"y2":185.5,"w":185.5,"h":185.5} の入力例

大まかな予想出力:

ここに画像の説明を入力

私が得ている画像は、入力画像とほぼ同じように見えます。

4

4 に答える 4

9

古いバージョンの Imagick (setimagematte は 6.2.9 より前のバージョンには存在しません) を使用している方のために、簡単な解決策を思いつきました。ここでのことは、マスクから元のイメージに不透明度をコピーすることです。

元の画像:

ここに画像の説明を入力

マスク:

ここに画像の説明を入力

結果:

ここに画像の説明を入力

コード:

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

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

Imagick の黒い円をマスクとして使用することもできますが、完璧ではないと判断したため、独自のものを使用しました。

もちろん、画像のサイズを変更/トリミングする必要がありますが、それは別の話です。

お役に立てれば。

J.

于 2013-12-03T10:02:05.880 に答える
4

コードの結果

これは私のために働きます:

<?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が少し遅れています。

于 2012-12-10T22:01:07.980 に答える