ソース PNG 画像は、ユーザー入力に基づいて Imagick を使用して PHP によってトリミングされます。結果は、透明なピクセルがある場合とない場合があるトリミングされた画像になります。トリミングされた画像に透過性があるかどうかを検出する方法を探しているので、不透明な PNG を JPG に変換できます。
これは、画像をロードするための私のコードです:
// Get user input
$src = $_POST['src'];
$resize = json_decode($_POST['selection_data']);
// Load image (source image has transparency)
$dst = new Imagick($src);
// Crop image (the part that will be cropped is fully opaque)
$dst->cropImage($resize->selW, $resize->selH, $resize->selX, $resize->selY);
$dst->resizeImage($resize->dstW, $resize->dstH, imagick::FILTER_CATROM, 0.9, false);
この後、 を使用してアルファチャンネルを確認でき$dst->getImageAlphaChannel()
ます。ただし、true
ソース イメージ (透過性を持つ) の読み込み中に設定されるため、トリミングされたイメージに透明なピクセルが含まれているかどうかに関係なく返されます。
透明なピクセルをチェックするもう 1 つの方法は、すべてのピクセルで 1* より小さいアルファ値を探すことです。
$alpha = false;
for ($x = 0; $x < $resize->dstW; $x++)
{
for ($y = 0; $y < $resize->dstH; $y++)
{
if ($dst->getImagePixelColor($x, $y)->getColorValue(Imagick::COLOR_ALPHA) < 1)
{
$alpha = true;
break 2;
}
}
}
しかし、大きな画像 (1000x1000) の場合、これを実行するのに 30 秒以上かかるため、理想的ではありません。
画像に透明なピクセルがあるかどうかを検出する最速の方法は何ですか?
*: 現在テスト中の Debian Wheezy では、不透明なピクセルは実際には 0.99999999976717 (32 ビット浮動小数点数) のアルファ値を返します。