PHPのGD画像処理ライブラリを使用する場合、画像のエッジ、特に線、テキスト、グラフィックの描画を滑らかにするために、 ImageAntialias()関数がよく使用されます。ただし、多くの開発者は、 ImageAntialias()がPNGフォーマット画像を処理する際に明らかな効果を生成しないことを発見します。なぜこれが起こるのですか?この記事では、その背後にある理由を理解してください。
ImageAntialias()関数は、画像のアンチアライアンスを有効または無効にするために使用されます。基本的な構文は次のとおりです。
imageantialias($image, true);
Trueに設定すると、GDライブラリは、画像を描画するときにグラフィックスのエッジを滑らかにするためにアンチエイリアシングアルゴリズムを使用しようとし、視覚効果を改善します。ただし、この反放射効果は、イメージ自体ではなく、主に図面操作に反映されていることに注意する必要があります。
つまり、GD( ImageLine() 、 ImagePolygon()などなど)を介して描かれた要素にのみ有効になり、ロードされた画像コンテンツに直接影響を与えません。
ImageAntialias()は、 ImageCreatetrueColor()を使用して作成された画像リソースに対してのみ有効です。 ImageCreate()を使用して作成されたパレット画像がパレットベースである場合、アンチエイリアス関数は有効になりません。 PNG画像は通常、真のカラー形式で保存されますが、 ImageCreatefrommpng()を介してロードされると、パレット形式でロードされる場合があります(画像自体の色モードに応じて)。
解決策は次のとおりです。
$image = imagecreatefrompng("https://m66.net/images/sample.png");
$trueColor = imagecreatetruecolor(imagesx($image), imagesy($image));
imagecopy($trueColor, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imageantialias($trueColor, true);
これは、多くの開発者が無視する重要なポイントです。ImageAntialias ()は、画像リソースの「すでにピクセル」に影響を与えません。つまり、既存のPNG画像をロードした場合、 ImageAntialias()を直接呼び出すことは画像を後処理しません。これは「画像フィルター」ではなく、描画最適化スイッチです。
PNG画像全体をぼかしまたは滑らかにする場合は、 ImageFilter()などの関数を使用する必要があります。例:
$image = imagecreatefrompng("https://m66.net/images/sample.png");
imagefilter($image, IMG_FILTER_SMOOTH, 10);
PNGはアルファチャネル(透明性)をサポートし、 ImageAntialias()は透明なピクセルエッジの混合を直接処理しません。透明な画像にコンテンツを描画する場合、エッジに「ギザギザ」がまだある場合があります。この時点で、半透明の色を使用して描画し、レイヤーの混合を組み合わせてより良いエッジ遷移を実現できます。
例:
$color = imagecolorallocatealpha($image, 255, 0, 0, 50); // 半透明の赤
imagefilledellipse($image, 100, 100, 50, 50, $color);
常にTruecolor画像リソースを使用してください。
描画操作のみを有効にします。
既存の画像で動作することを期待しないでください。
ImageFilter()と組み合わせて、より高度な画像最適化を実現します。
PNG画像を操作する際にImageAntialias()が効果がないことを発見したことがある場合、それが何であるかを誤解しているためになりそうです。これは、画像の削りや平滑化のフィルターではなく、「グラフィック図面」にのみ影響するスイッチです。それがどのように機能するかを理解した後、他のGD関数を組み合わせて、本当に必要な画像最適化効果を実現できます。