20

背景が透明な png 画像があり、それを背景が白い jpg 画像に変換したいと考えています。

コードは基本的に次のとおりです。

$image = new Imagick('transparent.png');
$image->writeImage('opaque.jpg');

しかし、それは黒い背景 jpg を作成します。透明を白に変換する方法を見つけようとして、これまでで最悪のドキュメントに苦労してきましたが、役に立ちませんでした。

編集:まあ、私はMarc Bのアイデアを試してみましたが、うまくいきました.

$image = new Imagick('transparent.png');
$white = new Imagick();

$white->newImage($image->getImageWidth(), $image->getImageHeight(), "white");
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$white->writeImage('opaque.jpg');

$image->destroy();
$white->destroy();

問題は、スクリプトが常に segfault を引き起こすことです。

4

10 に答える 10

9

試す:

$image = new Imagick('transparent.png');
$image->setImageMatte(true);
$image->setImageMatteColor('white');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
$image->writeImage('opaque.jpg');
于 2011-02-11T19:35:46.963 に答える
8

PDF を PNG に変換するときに同じ問題に遭遇し、flattenImages() を使用しました。

        //get the first page of the PDF
        $im = new imagick( $file.'[0]' );

        //set the background to white
        $im->setImageBackgroundColor('white');

        //flatten the image
        $im = $im->flattenImages(); 

        //do the rest of the image operations
        $im->setResolution( 181, 181 );
        $im->setCompressionQuality(100);
        $im->resizeImage ( 181, 181,  imagick::FILTER_LANCZOS, 1, TRUE);
        $im->setImageFormat('png');
        $imageName = $title.'_thumb.png';
于 2012-03-20T01:38:00.397 に答える
6
$image = new Imagick('transparent.pdf');
$image->setImageType (imagick::IMGTYPE_TRUECOLOR);
$image->writeImage('opaque.tif');

私のためにやった!

(以前の imagick::IMGTYPE_TRUECOLORMATTE の代わりに)

于 2012-11-26T00:41:37.613 に答える
1

これを試してください:

$white->newImage($image->getImageWidth(), $image->getImageHeight(), "transparent");
于 2012-03-15T22:12:29.883 に答える
1

以下に示すように、Imagick定数を変更して試すことができます

//$image will conatains image which needs background to be transparent
$white = new Imagick();

$white->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel( "white" ));
$white->compositeimage($image, Imagick::COMPOSITE_DEFAULT, $x1OfTransparentImage, $y1OfTransparentImage,);
$white->flattenImages();
$white->writeImage('opaque.jpg');    

$white->destroy();
于 2013-02-21T07:07:51.730 に答える
1

segfault の問題に関しては、同じ問題に遭遇しました。
どうやらそれへの参照または$image->writeImage('somename')破棄します。$image

私は同じ問題に遭遇していました。私がそれを回避した方法は、私が書き終えたオブジェクトの destroy の呼び出しを削除することでした。ずさんなようですが、セグメンテーション違反の問題は解決しました

于 2015-12-15T18:31:07.347 に答える
0

Segfault の問題: 同様の問題がありました (画像が適切に処理されて書き込まれた場合でも、スクリプトが segfault を返し続けました)。バグ レポートを確認した後に解決策が見つかりました 。https://bugs.php.net/bug を参照してください。 php?id=61122

それを知って、
$white->setResourceLimit(6, 1); // 6 means "limit threads to"
問題のある行の前に追加してみてください(私の場合、 $im->resizeImage(...); の前に配置する必要がありました)

于 2014-10-15T19:12:20.800 に答える