質問: 画像を扱うシステム内で、 オリジナル画像とそのサムネイル画像を生成する処理があります。 サムネイル画像の生成方法はjavaです。 ``` BufferedImage newBimg=new BufferedImage(newWidth,newHeight,BufferedImage.TYPE_3BYTE_BGR); newBimg.getGraphics().drawImage((ImageIO.read(originalImage)).getScaledInstance(newWidth,newHeight,Image.SCALE_AREA_AVERAGING),0, 0,newWidth,newHeight,null); ImageIO.write(newBimg,"jpg",new File(thumbnailImg.getAbsolutePath())); ``` 生成後に互いのファイル名がバラバラの状態になってしまった場合に、サムネイル画像を再生成せずに2つの画像ファイルを比較して、同じ画像であることを判断する方法はあるでしょうか。 ImageMagickのcompareコマンドを確認しましたが、サイズが同じ画像しか判定できないようでした。 linuxのodコマンドで画像のバイナリデータを読み込んで比較する方法も検討しましたが、画像によって共通する箇所が一定ではないようなので、複数の画像を一度に判定したい時も上手くできそうにありませんでした。 なにかいい方法があればご教授いただきたいです。 よろしくお願いします。
回答: > > サムネイル画像を再生成せずに2つの画像ファイルを比較して、同じ画像であることを判断する方法はあるでしょうか。 > > > 汎用的な手段は存在しません。 さらに言えば「サムネイル画像を再作成する」場合も、動作環境を完全に固定しない限りは、同一のサムネイル画像ファイルを出力できないため、単純なバイト比較では同一画像判定はできません。 * 「類似画像」の検索であれば、pHashなどで画像の特徴量を数値化し、その値がどの程度似ているかで判定することになります。(packet0さんコメントも参照) * 「厳密一致」を判定したいのであれば、システム内で生成するサムネイル画像ファイル中に、元ファイル名を識別できるメタ情報を埋め込むべきでしょう。JPEG形式であればEXIFデータを埋め込めます。