13

だから私はこのIMコマンドを持っています($ plistnewはポリゴンに期待する座標のリストです):

convert in.png ( -size 101x101 xc:black -fill white \
    -draw "polygon $plistnew" -alpha off \
    -crop 101x100+0+1 +repage \
    -scale 101x1! ) \
    -clut out.png

したがって、これを純粋なPHPに変換する必要があります。setImageAlphaChannel()の残りの問題を除いて、私はかなり成功しています。

とにかく、これは私のPHPです:

$tmpa = new Imagick(); // for the image I'm assuming is generated inside the parens
$tmpa->newPseudoImage(101, 101, 'canvas:black'); // xc:black

$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white')); // -fill white
$draw->polygon($points); // -draw "polygon $plistnew"

$tmpa->drawImage($draw);
$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE); // -alpha off
$tmpa->cropImage(101, 100, 0, 1); // -crop 101x100+0+1

// +repage
$tmpa->resetImagePage('');

$tmpa->scaleImage(101, 1); // -scale 101x1! -- I think scaleImage() ignores ratio per the ! by default ... I'm not positive though.

$im = new Imagick('in.png');
$im->clutImage($tmpa); // -clut
$im->writeImage('out.png');
$tmpa->destroy();

$ points変数は、ImagickDraw :: polygon()で使用するために適切に形成された配列です。

この行:

$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE);

フラットアウトは機能しません。このエラーが発生します:

PHP Fatal error:  Uncaught exception 'ImagickException' with message 'Unable to set image alpha channel'

私がそのラインアウトにコメントするとき、それ以外はすべてがうまく機能しているようです。このエラーを防ぐにはどうすればよいですか?

4

3 に答える 3

6

PNGとGIFのアルファチャンネルを削除する際にも問題があったため、いくつか試してみましたが、最終的にこれを使用しました:

// Image has transparency
if ($image->getImageAlphaChannel()) {

    // Remove alpha channel
    $image->setImageAlphaChannel(11);

    // Set image background color
    $image->setImageBackgroundColor('white');

    // Merge layers
    $image->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);
}

私のバージョンでは imagick::ALPHACHANNEL_REMOVE が機能しないため、「11」を使用しました。imagick::ALPHACHANNEL_REMOVE の参照については、次のコメントを参照してください: http://php.net/manual/en/imagick.flattenimages.php#116665

于 2015-06-20T19:42:08.890 に答える
-1

私はこれをテストしていませんが、最終的な目標がアルファ チャネルをサポートしない不透明な画像を生成することである場合は、おそらくImagick::setFormat関数をpng24に設定してみてください。

$tmpa->setFormat('png24');

これにより、Imagick オブジェクトは、不透明または透明な 32 ビット PNG 形式ではなく、不透明な 24 ビット PNG 形式を使用するようになります。画像に追加されたアルファ オブジェクトが適切に処理されるように、背景色などを設定する必要がある場合があります。

于 2012-06-19T19:12:40.947 に答える