PHPの画像処理機能では、 ImageColorresolve()は非常に一般的なツールです。その機能は、既存のパレット画像で指定された色に最も近いインデックスを見つけることです。見つかった場合、色のインデックスが返されます。見つからない場合は、理論的に失敗し、 -1を返す必要があります。
ただし、 ImageColorresolve()を使用する場合、多くの開発者は迷惑な問題に遭遇します。常に-1を返します。これは、色の解析が失敗したことを意味します。それで、なぜこれが起こっているのですか?それを解決する方法は?この記事では詳細に説明します。
画像はパレットベースの画像ではありません
ImageColorresolve()は、パレットタイプの画像( ImageCreate()で作成された画像など)でのみ動作します。画像がTrueColor画像( ImageCreateTrueColor()で作成されたなど)である場合、この関数は適切に機能せず、通常-1を直接返します。
色の数は上限に達します
パレット画像は最大256色しか持てません。画像の色数が上限に達した場合、 ImageColorresolve()を呼び出して新しい色を挿入しようとすると、故障して戻ります-1。
画像リソースは無効または破壊されます
ImageColorresolve()に渡された画像リソースが無効である場合、リソースが破壊された( Imagedestroy()が呼び出されます)、当然色は見つかりません。また、-1のみを返すことができます。
入力されたカラーパラメーター形式は正しくありません
ImageColorresolve()が必要とする色パラメーターは、個別のRGB値です。 0〜255の範囲を超える整数など、間違ったデータが渡されると、解析が失敗します。
環境またはGDライブラリの問題
まれに、PHPのGD拡張が欠陥がある場合、またはバージョンが古すぎる場合、関数の例外を引き起こす可能性もあります。
TrueColor画像の代わりに、パレット画像で動作していることを確認してください。 ImageCreate()は、画像を作成するために使用できます。
$image = imagecreate(100, 100); // パレット画像を作成します
$white = imagecolorallocate($image, 255, 255, 255);
ImageCreateTrueColor()を使用してTrueColor画像を作成した場合、 ImagetRueColortopalette()を使用してパレット画像に変換できます。
$image = imagecreatetruecolor(100, 100);
// パレット画像に変換します
imagetruecolortopalette($image, false, 256);
$colorIndex = imagecolorresolve($image, 255, 0, 0);
ImageColorStotal()を使用して、現在の画像の色の総数を確認できます。
$colors = imagecolorstotal($image);
if ($colors >= 256) {
echo "色はいっぱいです,新しい色を追加することはできません。";
}
色がいっぱいの場合は、色を再割り当てするか、同様の色を融合してみてください。
呼び出されたときに画像リソースが有効であることを確認してください。
if (!is_resource($image)) {
die('画像リソースは無効であるか、破壊されています');
}
PHP 8.0+の後、 IS_RESOURCE()を使用して、 GetType($ image)=== 'GD'で判断します。
RGB値は0〜255の整数でなければなりません。例:
$red = 255;
$green = 0;
$blue = 0;
if ($red >= 0 && $red <= 255 && $green >= 0 && $green <= 255 && $blue >= 0 && $blue <= 255) {
$colorIndex = imagecolorresolve($image, $red, $green, $blue);
} else {
echo "RGB価値は合法です";
}
次のコードを使用して、PHP構成の現在のGDバージョンを表示できます。
echo gd_info()["GD Version"];
バージョンが低すぎることがわかった場合は、サーバーのPHPまたはGDライブラリのアップグレードを検討できます。
完全な例:
<?php
$image = imagecreate(100, 100); // カラーパレット図を作成します
$background = imagecolorallocate($image, 255, 255, 255); // 白い背景
$redIndex = imagecolorresolve($image, 255, 0, 0); // 赤を手に入れてみてください
if ($redIndex == -1) {
echo "色解析が失敗しました,画像の種類または色の量を確認してください。";
} else {
echo "赤い色のインデックスはです: " . $redIndex;
}
// ブラウザに画像を出力します(たとえば、のみ)
header('Content-Type: image/png');
imagepng($image);
// リソースをクリーンアップします
imagedestroy($image);
?>
PHP画像処理チュートリアルの詳細については、 https://m66.net/php-gd-image-processing-tutorialにアクセスしてください。
ImageColorresolve()が常に-1を返す場合、それは基本的に画像タイプのエラーまたは色の数が制限を超えることによって引き起こされます。上記の方法に従ってトラブルシューティングを行うだけで、問題を見つけてより簡単に修正できます。