0

画像ファイルのフィンガープリントを計算して、同じ画像のサイズ変更されたコピー (および異なる形式のコピー) を検出する簡単なスクリプトに取り組んでいます。imagecolorat()画像の色の値にアクセスするには、次のように画像のすべてのピクセルを読み取る必要があることを除いて、すべてがうまく機能します。

function image_chksum (&$src_image, $x1, $y1, $x2, $y2) {
        $chksum = 0;
        for ($x = $x1; $x < $x2; $x++)
                for ($y = $y1; $y < $y2; $y++) {
                        $rgb = imagecolorsforindex ($src_image, imagecolorat($src_image, $x, $y));
                        $sum = ($rgb["red"] + $rgb["green"] + $rgb["blue"] + $rgb["alpha"]);
                        $chksum += $sum;
                }
        return $chksum;
}

(それが何をするかに注意を払わないでください。これはアルゴリズム全体ではなく、単なる例です)

そう。この醜いコードを見ると、質問が出てきます.gd画像リソース($src_image私の場合)にアクセスして、それを配列などとして使用できますか? このメソッドが PIL/PILLOW を使用して Python で動作するのを見てきました。

この問題は、アルファ png 画像をチェックするときにも発生します。残念ながら、ここで説明されている方法: How to check a PNG for grayscale/alpha color type? トゥルーカラー以外の画像では機能しないため、すべてのピクセルをチェックするようにフォールバックする必要があります (再び)。透明度は通常、単一のピクセルではなく領域で使用されるため、最初のアイデアは N 番目のピクセルごとにチェックすることですが、それは非常にクールではありません。

4

1 に答える 1

0

QB 拡張機能は、探しているソリューションである可能性があります。多次元配列として GD イメージにアクセスできます。どちらが便利かによって、各ピクセルが 4 つの 8 ビット整数の配列である uint8[4] の配列、または各ピクセルが4 つの 32 ビット浮動小数点数の配列 (値は 0 から 1 の間)。

パフォーマンスは、通常の PHP よりも少なくとも 1 桁は向上するはずです。ネイティブ コンパイルを有効にすると、コードの実行速度がさらに 5 倍速くなります。

于 2013-07-24T22:10:51.573 に答える