ホームページ >バックエンド開発 >PHPチュートリアル >JAVA の原則が PHP に移植されます
JAVA の原則は PHP に移植されています
以下は、CSDN からダウンロードした JAVA ソース コードの一部です。目的は、画像のフィンガープリントを計算することです、
public static String generatedFingerPrint(String filename) {
BufferedImage source = ImageHelper.readPNGImage(filename);//ファイルを読み取ります
int width = 8;
int 高さ = 8;
// 最初のステップはサイズを小さくすることです。
// 画像を 8x8 サイズ、合計 64 ピクセルに縮小します。このステップの機能は、画像の詳細を削除し、構造、明暗などの基本情報のみを保持し、サイズや比率の違いによって生じる画像の違いを破棄することです。
BufferedImage サム = ImageHelper.thumb(ソース、幅、高さ、false);
// 2 番目のステップは、色を単純化することです。
// 縮小画像を 64 レベルのグレースケールに変換します。言い換えれば、すべてのピクセルの色は合計 64 色しかありません。
int[] ピクセル = new int[幅 * 高さ];
for (int i = 0; i
for (int j = 0; j
ピクセル[i * 高さ + j] = ImageHelper.rgbToGray(thumb.getRGB(i, j));
}
}
// 3 番目のステップは平均を計算することです。
// すべての 64 ピクセルのグレースケール平均を計算します。
int avgPixel = ImageHelper.average(ピクセル);
// 4 番目のステップは、ピクセルのグレースケールを比較することです。
// 各ピクセルのグレースケールを平均値と比較します。平均以上の場合は 1 として記録され、平均未満の場合は 0 として記録されます。
int[] comps = new int[幅 * 高さ];
for (int i = 0; i < comps.length; i++) {
if (ピクセル[i] >= avgピクセル) {
comps[i] = 1;
} else {
comps[i] = 0;
}
}
// 5 番目のステップは、ハッシュ値を計算することです。
// 前のステップの比較結果を結合して、この画像のフィンガープリントとなる 64 ビット整数を形成します。組み合わせの順序は重要ではありません。すべての画像が同じ順序であることを確認してください。
StringBuffer hashCode = new StringBuffer();
for (int i = 0; i
int 結果 = comps[i] * (int) Math.pow(2, 3) + comps[i + 1] * (int) Math.pow(2, 2) + comps[i + 2] * (int) Math .pow(2, 1) + comps[i + 2];
hashCode.append(binaryToHex(result));
}
// フィンガープリントを取得した後、さまざまな写真を比較して、64 ビットのうちどれだけが異なっているかを確認できます。
return hashCode.toString();
}
PHP を使用してこの機能を実現する Web ページを構築したいと考えています。PHP に変換するためのソース コードを提供してくれる専門家はいますか?
------解決策---------
アルゴリズムは非常にわかりやすく説明されていますが、難しいです実装が難しい
PHP は 64 ビット整数をサポートしていないことに注意してください。そのため、関数はいくつかの可能な戻りスタイルを提供します
/**<br> * 指紋を生成<br> * $filename 画像ファイル名。URL を指定できます。 GD<br> でサポートされている画像タイプのみを使用できます。 * $retmode の戻り形式: 0 バイナリ表現 1 配列 2 16 進表現 <br> **/<br> functionProduceFingerPrint($filename, $retmode=0) {<br> $sim = imagecreatefromstring( file_get_contents($filename) );<br> $dim = imagecreate(8, 8);<br> imagecopyresize($dim, $sim, 0, 0, 0, 0, 8, 8, imagex($sim), imagesy($sim));<br> imagetruecolortopalette($sim, true, 64);<br> //imagefilter($sim, IMG_FILTER_GRAYSCALE);<br> <br> for($x=0; $x $c = imagecolorat($dim, $x, $y);<br> $p[] = array_sum(imagecolorsforindex($dim, $c))/3;<br> }<br> $avl = array_sum($p)/count($p);<br> $r = '';<br> foreach($p as $v) $r .= $v>=$avl 1 : 0;<br> <br> if($retmode == 0) return $r;<br> $p = array_map('bindec', str_split($r, 8));<br> if($retmode == 1) return $p;<br> if($retmode == 2) { <div class="clear"></div>