• ベストアンサー

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

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

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

  • ベストアンサー
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5

抜けがあった。 (binary)file_get_contents($img1, FILE_BINARY) === (binary)file_get_contents($img2, FILE_BINARY)

tadao-o
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

この場合 == でも、=== でもどちらでもいい。 習慣的に === を使うのはいいことだと思いますが。 そんなものより、FALSE が返ってきてるかどうかを[厳密に]調べる必要があるのでは? > 画像ファイルを文字列として扱い 暗号化は単なる比較目的で使用するものではない。 (binary)file_get_contents($img1) === (binary)file_get_contents($img2) ファイルの差分が必要な場合は xdiff

全文を見る
すると、全ての回答が全文表示されます。
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答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> ===========================================================

tadao-o
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
回答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
tadao-o
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答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() で 画像の縦横の大きさを比べるとか、 そんな程度しか思いつきません。 できるかどうかは分かりませんが、ハッシュを使わずに、そのまま文字列として比較するっていう乱暴な方法もあるかもしれません。

tadao-o
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テキストファイルを経由しての画像呼び出し

    はじめまして。 PHPをはじめてまだ間もない者ですが、行き詰ってしまいましたのでご質問させていただきたいと思います。 画像をアップロードする時に backimg.txt という名前でファイル名を取得しているのですが それを利用して画像を呼び出そうとしているのですがどうにも表示してくれません。 表示どころか、エラーが出てしまいます… ファイル構成・PHP部分は以下の通りです。 public_html ├─ index.php  ←ここの一部のプログラムです ├─  ・ ├─  ・ └─ background_img     ├─ backimg.txt  アップロードしたファイル名が記述     └─ test.jpg   アップロードした画像 <?php if(file_exists("background_img/backimg.txt")){ $fp = fopen("background_img/backimg.txt","r") or die("ファイルのオープンに失敗しました"); $buff = fgets($fp); fclose($fp); } echo'<img src="'.$buff.'" border="0">'; ?> ※この $buff = fgets($fp); の部分でエラーが出ます。 backimg.txt内の文字(UPする度、この一行を上書きしていってます) ──────────────────   background_img/test.jpg ────────────────── ※PHPでアップロードした画像は  background_img フォルダに入るようになっています。 ※画像名はまちまち変わりますので、 test.jpg 固定ではありません。 ※データベースを使えないサーバを利用しております。 以上の条件でどうやったら解決できるのか、 お手数おかけいたしますが、教えていただければ幸いに思います。

    • ベストアンサー
    • PHP
  • フルパスからファイル名取得をしたい

    たとえば http://hoge.com/hoge.php とあった場合、そのhoge.phpの中で"hoge"という文字列 を取得したいのですが。。。 どうやればいいでしょうか? よろしく願いします。

    • ベストアンサー
    • PHP
  • phpでテキストファイルの特定のワードを抽出

    タイトルの通りです。 phpを使い、テキストファイルの中に書かれている文字列をhtmlに表示することはできました。 <?php //ファイルを開く //モード[r]の読み込み専用 if (! ($fp = fopen ( "list.txt", "r" ))) { echo "ファイルが開けません。"; } while (! feof ($fp)) { $load = fgets ($fp, 4096); echo $load; } ?> このような感じです。 ですが、テキストファイルの中の特定の文字(例:美しい)を抽出したいのですが、どのようにプログラムを書いて良いかわかりません。 どなたかアドバイスをお願いします。

    • 締切済み
    • PHP
  • htmlの入力フォームからphpに値を渡しphpから画像ファイルが組み込まれたhtmlを生成する方法について

    イメージとしては脳内メーカーの様に、入力された文字列を画像に置き換えて、 生成されたhtmlに画像の組み込みを行いたいのですが上手くいきません。 基礎的な理解が低くて申し訳ないのですが、 やりたい事は以下のとおりです。 (1)「入力.html」ファイルのインプットフォームに文字情報を入力。 (2)入力した文字情報を「処理.php」ファイルに送信。 (3)「処理.php」ファイルで入力された文字列を画像ファイルに置き換える。⇒「画像.jpg」を生成。 (4)生成された「画像.jpg」を「出力.html」ファイルに組み込み、「出力.html」を表示。 (1)(2)(3)の工程までは作成できたのですが、生成した画像を別のhtmlファイルに組み込んで表示させる方法が分かりません。 <IMG src="~.php?val=XXX">といった形でhtmlに組み込むことができるのはわかっているのですが、、、、、 セッション変数を使わないとだめなのでしょうか?

    • 締切済み
    • PHP
  • mysqlのblob型の画像表示について

    テーブルの項目にblob型を作成し、 phpでテーブルから取得した画像を画面に表示させたいのですが、 以下のように表示させることは可能でしょうか? test.php ---------- ここから画面 ---------------------------------------- 取得したblob型の画像その1.jpg 取得したblob型の画像その2.gif 取得したblob型の画像その3.png それぞれの画像の説明 ---------- ここまで画面 ---------------------------------------- テーブルへのデータ挿入はphpMyAdminから挿入しています。 header('Content-type: image/jpeg'); echo SQLで取得した値; のようにすればjpg画像は表示できましたが、gif画像とpng画像は表示できませんでした。 また、jpg画像のみを表示させることは出来ましたが文章を表示させることはできませんでした。 上記のように一つのphpファイルで複数表示させるのはできないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPでgz形式のファイルをダウンロード→解凍出来ない

    こんにちは。ブラウザからリクエストがあった際に、 ローカルに保存されているgzip形式で圧縮した XMLファイルをPHPで読み込んで ダウンロードさせる、というプログラムを作成しております。 ダウンロードした後、解凍しようとすると 「破損ファイルです」とのメッセージが出て 解凍が出来ません。 ダウンロードしたファイルをバイナリエディタで開いてみると、 先頭に"0A"、 末尾に"0A090A" というゴミ?なんでしょうか、変なものが付いています。 (これが何かは調べても分かりませんでした。 また、このゴミを削除すると解凍出来ました) ローカルに保存したファイル、及び、PHP内の読み込みまではゴミは付いていませんでした。 //ソース抜粋 header('Content-Type: application/gzip;'); header('Content-disposition: attachment; filename=hogexml.gz'); $fp = fopen('/home/hoge/hogexml.gz', 'rb'); $str = fread($fp, filesize('/home/hoge/hogexml.gz')); $echo $str; //この時点でbin2hex()で$strをダンプしてもゴミは付いていない fclose($fp); ファイルはEUC-JPでDBから取得した文字列をUTF-8に変換してから圧縮して作成しております。 圧縮関数はgzopen(),gzwrite(),gzclose()です。 またブラウザからhttp://hogehoge_arienai.com/hogexml.gzという様に ファイルを直接指定してダウンロードした場合は問題なく解凍されました。 八方塞がり状態でどうしたら良いものかと・・(´△⊂)・. こういった現象にちょっとでも心あたりのある方おられましたら ヒントでも構いませんので、何卒ご返答の程よろしくお願い致しますす。 <PHPスクリプトの動いているサーバ> OS:FreeBSD6.1 Apache:2.0.58 PHP:5.1.2 <ダウンロードしているクライアント> WindowsXP Pro

    • ベストアンサー
    • PHP
  • 2次元ハッシュ または 2次元配列をソートしたい

    2次元ハッシュのソートをしたいです。 ハッシュは2つのキーを使用していて、 1つ目のキーは文字列、2つ目のキーは数字(0からの連番)です。 ハッシュの中身は文字列が入っています。 これを次のような表に見立てて、特定の列でソートしたいのです。 hash['a']['0'], hash['a']['1'], ..., hash['a']['50'], hash['q']['0'], hash['q']['1'], ..., hash['q']['50'], hash['c']['0'], hash['c']['1'], ..., hash['c']['50'], ... hash['d']['0'], hash['d']['1'], ..., hash['d']['50'], 例えば 6列目の値によってソートするということです。 以下のようにソートしようとしましたが、うまくいきません。 my @sorthash = sort { $a->[6] <=> $b->[6] } @hash; 何かヒントがあれば教えてください。

    • ベストアンサー
    • Perl
  • CでCSVファイルを扱う

    いつもお世話になっております。 今回はCSVファイルの扱いについてお聞きしたいです。 現在、 "hoge","hogehoge","…","…" というようなCSVファイルを扱いたいと思い、いろいろ試しているのですがなかなかうまくいきません。 CSVの各行をgetlineで取得して、カンマで分けるだけならできたのですが、","のまとまりで分けたいのです。現在は文字で分割はできるのですが文字列で分割する方法がわかりません。 ","で分けたい理由はたとえば"hoge,hoge"という文字列をカンマで分けてしまうと二つに分かれてしまいそれを避けたいです。 分割点の前後の文字から判断しようともしてみましたがうまくいきませんでした。 アドバイスなどありましたらご教授願います。 現在は以下のようになっております。 ifstream ifs; string temp; LPCTSTR str; ifs.open("test.csv", ios::in); while(getline(ifs, temp)) {  str = strtok(const_cast<char*>(temp.c_str()), _T(",")); printf("%s\n", str);  while(str != NULL)  {   str = strtok(NULL, ",");   if (str != NULL)   {    printf("%s\n", str);   }  } } 以上のもので CSVの"1","2","3","4" が"1"と"2"と"3"と"4"になります。 これを1と2と3と4にしたいです。 よろしくお願いします。 環境はWindowsXP VisualStudio6.0 MFC未使用 です。お願いします。

  • fopenの使い方?(画像の保存)

    お世話になります。 exif_thumbnailで取得したサムネイル画像をjpgファイルとして元画像ファイルとは別名で保存したいと考えています。 テストで以下のようなコードを作成しましたが、うまく保存できません。fopenの基本的な使い方が間違っているのではないかと思っていますが、どこがおかしいのかわからずにおります。 <?php $img = exif_thumbnail("./test.jpg", $width, $height, $type); $handle = fopen ("./thumb.jpg", 'a'); fwrite($handle, $img); ?> ちなみにPHPのバージョンは5.0.3です。 echo($img);でサムネイル画像が取得できていることは確認できております。 要はtest.jpg → $img → thumb.jpgとできればいいのですが。。 どうしたらうまく保存できますでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • bash での空文字判定?

    文字列が空文字かどうか判定する場合(?)に、よく以下のような記述を見ます if [ "x${str}" = "x" ]; then echo "str is empty." fi なぜ、"${str}" = "" ではないのでしょうか?

中2の不登校の息子について
このQ&Aのポイント
  • 中2の息子が夏休み明けから不登校になりました。いじめや友達関係の問題はなく、学校へ行く理由を説明できないようです。
  • 息子はオンラインゲームに熱中しており、学校との折り合いをつけていましたが、不登校で生活リズムも乱れてきています。
  • 現在は適応教室に通っており、始めは頑張っていましたが、最近は行けなくなってしまっています。親として将来が不安で悩んでいます。
回答を見る

専門家に質問してみよう