dポイントプレゼントキャンペーン実施中!

PHPを使って2つの画像ファイルが異なるファイルであることを判定するプログラムを考えています。以下のように、画像ファイルを文字列として扱い、md5ハッシュ値を取得し、それを比較することで、画像ファイルが違うということを判別しています。

こちらですが、もし他に良いロジックをご存知の方がいらっしゃいましたら、ご意見いただければと思います。
よろしくお願いいたします。

<?php
$hash1 = getMD5('hoge1.jpg');
$hash2 = getMD5('hoge2.jpg');
if ($hash1 == $hash2) {
echo "同じ画像ファイルです。";
} else {
echo "同じ画像ファイルではありません。";
}

// 画像ファイルを文字列として扱い、
// md5ハッシュ値を取得する関数
function getMD5($image) {
$fp = fopen($image, 'r');
$str = '';
while(!feof($fp)) {
# 画像ファイルを1行ずつ読み込んで、文字列にする
$str .= fgets($fp);
}
fclose($fp);
// $strのmd5ハッシュ値を得る
return md5($str);
}
?>

A 回答 (5件)

抜けがあった。


(binary)file_get_contents($img1, FILE_BINARY) === (binary)file_get_contents($img2, FILE_BINARY)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。実際にテストしてみたところ問題なく画像の判別ができました。こちら、是非参考にさせていただきたいと思います。

お礼日時:2010/03/07 02:02

この場合 == でも、=== でもどちらでもいい。


習慣的に === を使うのはいいことだと思いますが。
そんなものより、FALSE が返ってきてるかどうかを[厳密に]調べる必要があるのでは?

> 画像ファイルを文字列として扱い
暗号化は単なる比較目的で使用するものではない。

(binary)file_get_contents($img1) === (binary)file_get_contents($img2)

ファイルの差分が必要な場合は xdiff
    • good
    • 0

質問の回答にはなっていませんので、ご了承ください。


ちょっとした、ゴミプロ作ってみました。
別の関数使っても結果が同じになるという例です。

あ、そうそう、そういえば、#2さんがやっているように、
文字列の比較は「===」か「strcmp()」使うのが、いいらしいです。
strcmp()を使うのが鉄則。みたいな言い方をしている人もいますが、ホントのとこは俺は知りません。
文字列の比較に「==」を使うと 動作がキモいらしいです。まぁ、ケースバイケースだと思いますが。
http://d.hatena.ne.jp/hnw/20080606
「strcmp()」も 場合によって 良くないらしいです。
http://d.hatena.ne.jp/hnw/20090123
===========================================================
<html>
<head>
<meta http-equiv=content-type content=text/html; charset=utf-8>
</head>
<body>
<?
$me = $_SERVER[PHP_SELF];
$ImageFile = "icon.gif";
$Str = file_get_contents($ImageFile);
//---------------------------------------------------------
$md01 = md5($Str);
$md02 = md5_file($ImageFile);
print "$md01<br>$md02<hr>";
//---------------------------------------------------------
$len01 = filesize($ImageFile);
$len02 = strlen($Str);
print "$len01<br>$len02<hr>";
//---------------------------------------------------------
?>
</body>
</html>
===========================================================
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。わかりやすいサンプルプログラムを準備していただき助かります。参考にさせていただきます。

お礼日時:2010/03/07 01:52

md5_file()


こちらの関数でハッシュ値を比較してみてはいかがでしょうか。
<?php
if(md5_file('hoge1.jpg') === md5_file('hoge2.jpg')){
  echo "同じ画像ファイルです。";
}else{
  echo "同じ画像ファイルではありません。";
}
?>

参考URL:http://php.net/manual/ja/function.md5-file.php
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。md5_fileという関数があるのは知りませんでした。参考にさせていただきます。

お礼日時:2010/03/07 01:47

とりあえず、そちらの書いたソースの



$fp = fopen($image, 'r');
$str = '';
while(!feof($fp)) {
# 画像ファイルを1行ずつ読み込んで、文字列にする
$str .= fgets($fp);
}
fclose($fp);

は、よほど PHPのバージョンが古くない限りは、

$str = file_get_contents($image);

一行で済みます。

どの程度の精度を求めているのか分からないので、かなりテキトーです。
大雑把に filesize() で分けてしまうとか、
GD が入ってる必要がありますが、imagecreatefromjpeg() とかして、imagesx() , imagesy() で 画像の縦横の大きさを比べるとか、
そんな程度しか思いつきません。

できるかどうかは分かりませんが、ハッシュを使わずに、そのまま文字列として比較するっていう乱暴な方法もあるかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。確かにfile_get_contentsは便利ですね。是非、使いたいと思います。

お礼日時:2010/03/07 01:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!