• ベストアンサー
  • すぐに回答を!

2つの画像ファイルが異なるファイルだと判定したい

  • 質問No.5723128
  • 閲覧数942
  • ありがとう数15
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 50% (4/8)

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);
}
?>

質問者が選んだベストアンサー

  • 回答No.5
  • ベストアンサー

ベストアンサー率 52% (106/202)

抜けがあった。
(binary)file_get_contents($img1, FILE_BINARY) === (binary)file_get_contents($img2, FILE_BINARY)
お礼コメント
tadao-o

お礼率 50% (4/8)

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

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 52% (106/202)

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

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

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

ファイルの差分が必要な場合は xdiff
  • 回答No.3

ベストアンサー率 51% (200/388)

質問の回答にはなっていませんので、ご了承ください。
ちょっとした、ゴミプロ作ってみました。
別の関数使っても結果が同じになるという例です。

あ、そうそう、そういえば、#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>
===========================================================
お礼コメント
tadao-o

お礼率 50% (4/8)

ご回答ありがとうございます。わかりやすいサンプルプログラムを準備していただき助かります。参考にさせていただきます。
投稿日時:2010/03/07 01:52
  • 回答No.2

ベストアンサー率 66% (14/21)

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

お礼率 50% (4/8)

ご回答ありがとうございます。md5_fileという関数があるのは知りませんでした。参考にさせていただきます。
投稿日時:2010/03/07 01:47
  • 回答No.1

ベストアンサー率 51% (200/388)

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

$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() で 画像の縦横の大きさを比べるとか、
そんな程度しか思いつきません。

できるかどうかは分かりませんが、ハッシュを使わずに、そのまま文字列として比較するっていう乱暴な方法もあるかもしれません。
お礼コメント
tadao-o

お礼率 50% (4/8)

ご回答ありがとうございます。確かにfile_get_contentsは便利ですね。是非、使いたいと思います。
投稿日時:2010/03/07 01:50
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ