
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.4
- 回答日時:
この場合 == でも、=== でもどちらでもいい。
習慣的に === を使うのはいいことだと思いますが。
そんなものより、FALSE が返ってきてるかどうかを[厳密に]調べる必要があるのでは?
> 画像ファイルを文字列として扱い
暗号化は単なる比較目的で使用するものではない。
(binary)file_get_contents($img1) === (binary)file_get_contents($img2)
ファイルの差分が必要な場合は xdiff
No.3
- 回答日時:
質問の回答にはなっていませんので、ご了承ください。
ちょっとした、ゴミプロ作ってみました。
別の関数使っても結果が同じになるという例です。
あ、そうそう、そういえば、#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>
===========================================================

No.2
- 回答日時:
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
No.1
- 回答日時:
とりあえず、そちらの書いたソースの
$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() で 画像の縦横の大きさを比べるとか、
そんな程度しか思いつきません。
できるかどうかは分かりませんが、ハッシュを使わずに、そのまま文字列として比較するっていう乱暴な方法もあるかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cronのエラー出力ファイルに2行...
-
PHPのif文でその処理を途中で抜...
-
バッチを用いたフォルダの自動移動
-
$_SESSION 有効期限をブラウザ...
-
SQLiteに画像を格納したい
-
copy() で属性保存
-
拡張子php画像をjpg画像等に変...
-
「クラス関数」「メンバ関数」...
-
require_once()でファイルが読...
-
PEAR Image_QRCodeのエラー
-
system()でssh命令文の実行結果...
-
HPを開くとダウンロードページ...
-
wgetの使い方
-
VB.NETのFTPダウンロードについて
-
Smartのカスタマイズでエラー
-
pictureboxに表示した画像のフ...
-
3つ以上の論理積は利用可能なの...
-
getimagesizeで画像がなかった...
-
SELECTの値を保持する
-
CSV出力にHTMLが入ってしまう
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つの画像ファイルが異なるファ...
-
stat failed
-
phpのftp_get()でエラーが出ます。
-
shift-jisでfgetcsv
-
ファイル名は、数字の「0」(...
-
ファイルの行数取得
-
日本語が文字化けしないよう読...
-
phpメールフォームから送信・登...
-
新規ファイルを保存できない
-
別のサーバにあるファイルの存...
-
pdfファイルをメンバーのみに閲...
-
register_globalsについて
-
リネームについて
-
ネットワークの指定は?
-
XMLのロードに失敗する
-
PHPでFilename cannot be empty...
-
日本語のデータが文字化けをし...
-
Smartyで吐き出されたhtmlソー...
-
PHPでテキストファイルかどうか...
-
PHP+MySQL でのcsvファイルイン...
おすすめ情報