現在の位置: ホーム> 最新記事一覧> ImageColorresolve()24ビットおよび8ビット画像の動作の違い

ImageColorresolve()24ビットおよび8ビット画像の動作の違い

M66 2025-05-29

画像処理にPHPを使用する場合、 ImageColorresolve()関数は、パレット画像を処理するシーンにしばしば表示されます。しかし、多くの開発者がこの関数を使用する場合、彼らはしばしば疑問に思います:** 24ビット(TrueColor)画像と8ビット(パレット)画像の動作の違いは何ですか? **今日、この問題について詳しく説明します。

ImageColorresolve()とは何ですか?

まず、 ImageColorresolve()を簡単に紹介しましょう。この関数の関数は次のとおりです。
指定された色がすでにパレット画像に存在するかどうかを見つけます。存在する場合は、色インデックスを返します。存在しない場合は、この色をパレットに追加しようとし、新しいインデックスを返します。

基本的な使用例:

 <?php
// 写真を作成します 8 ビットパレット画像
$image = imagecreate(100, 100);

// 赤の定義
$red = imagecolorresolve($image, 255, 0, 0);

// この色で長方形を描きます
imagefilledrectangle($image, 10, 10, 90, 90, $red);

// 出力画像
header('Content-Type: image/png');
imagepng($image);

// リソースを破壊します
imagedestroy($image);
?>

ここで、パレットにすでに赤が存在する場合、 ImageColorresolve()は既存の色インデックスを返します。それ以外の場合は、パレットに赤を自動的に追加します。

画像内の24ビット(TrueColor)動作

ImageCreateTrueColor()を使用して24ビットのTrueColor画像を作成すると、画像自体にはパレットがありません。各ピクセルは、RGBカラー値を個別に保存できます。

質問は、 TrueColor画像でImageColorresolve()を呼び出すとどうなりますか?

答えは次のとおりです。
ImageColorresolve()を呼び出す場合でも、PHPは実際には見上げたり、色のインデックスを追加したりしませんが、RGB値から計算された整数(つまり、色の識別)を返します。

例えば:

 <?php
// 写真を作成します 24 少し TrueColor 画像
$image = imagecreatetruecolor(100, 100);

// 青を定義します
$blue = imagecolorresolve($image, 0, 0, 255);

// この色で長方形を描きます
imagefilledrectangle($image, 10, 10, 90, 90, $blue);

// 出力画像
header('Content-Type: image/png');
imagepng($image);

imagedestroy($image);
?>

ここでは、$ blueは整数(たとえば255 )であり、カラーインデックスではありません。このモードでは、各ピクセルが完全なRGB情報を個別に保存できるため、色の存在について心配する必要さえありません。

画像の8ビット(カラーパレット)動作

8ビット画像( ImageCreate()によって作成された)では、画像の色は限られており、せいぜい256色しかありません。

したがって、 ImageColorresolve()が呼び出されると、PHPは次のとおりです。

  1. カラーパレット全体を繰り返して、指定された色がすでに存在するかどうかを確認します。

  2. 存在する場合は、インデックスを返します。

  3. 存在しない場合は、パレットに追加します(スペースが十分な場合)。

  4. パレットがいっぱいの場合は、指定された色に最も近い既存の色のインデックスを返します。

これは、複雑な画像を処理するときに8ビットの画像が色の歪みを起こしやすい場合がある理由でもあります。これは、色が「近似」しているためです。

例:

 <?php
$image = imagecreate(100, 100);

// パレット制限を超える色を追加してみてください
for ($i = 0; $i < 300; $i++) {
    $color = imagecolorresolve($image, rand(0,255), rand(0,255), rand(0,255));
}

// 画像を生成します,見るために
header('Content-Type: image/png');
imagepng($image);

// リソースリリース
imagedestroy($image);
?>

上記のコードでは、300種類の色が追加されましたが、画像には最大256色しかあり、過剰は「ほぼ一致」します。

まとめ

画像タイプImageColorresolve()動作の説明
24ビットトゥルーエコラーパレットを使用せずに、色値(int)を返します
8ビットカラーパレット画像256色に制限されたカラーインデックスを見つけたり追加したりします

したがって、要約するには:

  • 24ビット画像では、 ImageColorresolve()はそれほど必要ありません。 ImageColorAllocate()を直接使用したり、自分で色を作成したりできます。

  • 8ビット画像では、特に画像の色の数と分布を制御する必要がある場合に非常に重要です。

ヒント

8ビット画像を処理するときに頻繁にカラー欠乏が発生した場合は、画像を生成する前にImageCreateTrueColor()を呼び出し、必要に応じてImageTrueColortopalette()を使用してTrueColor画像をパレット画像に変換することを検討できます。 PHPは色を自動的に最適化します。

サンプルコードリファレンス: