2017-06-29 10 views
1

BufferedImageの上にテキストを書き込もうとしていて、同じ画像とピクセル単位で比較しています。ただし、比較は常に失敗します。私のコードは次のようになります。BufferedImageに変更を適用

BufferedImage referenceImage = ImageIO.read(new File("reference.jpg")); 
    BufferedImage image = ImageIO.read(new File("base_image.jpg")); 
    image.createGraphics().drawString("hello world", 10, 10); 
    //ImageIO.write(image, "jpg", new File("newimage.jpg")); 
    //image = ImageIO.read(new File("newimage.jpg")); 
    assertEquals(image.getWidth(), referenceImage.getWidth()); 
    assertEquals(image.getHeight(), referenceImage.getHeight()); 
    boolean identicalImages = true; 
    for (int x = 0; x < image.getWidth(); x++) { 
     for (int y = 0; y < image.getHeight(); y++) { 
      if (image.getRGB(x, y) != referenceImage.getRGB(x, y)) { 
       identicalImages = false; 
      } 
     } 
    } 
    assertTrue(identicalImages); 

ただし、2つのコメント行のコメントを外すと、コードは期待通りに機能します。私はそれがフラッシングを必要とするバッファと関係していると疑っています。私はイメージオブジェクトをフラッシュしようとしましたが、運はありません。もし誰かが何が起こっているのか、それをディスクに書き込んだり、それを読んだりすることなく、それを稼働させる方法があれば、それはすばらしいでしょう。

+1

'BufferedImage#createGraphics'の結果を変数に代入し、終了したら' Graphics#dispose'を呼び出す - 違いが出るかどうかは分かりませんが、最初の2行に同じファイルを読み込むとどうなりますか? – MadProgrammer

+0

最初の2行に同じファイルを読み込むとどうなりますか? –

+0

多分文字列youre drawingは画像の背景と同じ色です –

答えて

1

保存/読み込み後に画像が同じになるのは、その後に両方の画像が(損失の多い)JPEG変換の影響を受けたためです。その前に、base_imageに書き込まれたテキストは "変換されていません"。

+0

ベースイメージは単なるバックグラウンドイメージです。reference_imageはbase_imageで、テキストは上に描画されます。ベースイメージにテキストを追加した後も同じですが、イメージを保存して再読み込みしない限り、ピクセル単位の比較は失敗します。 – turingcomplete

+0

@turingcomplete明確にするために、 'base_image'にテキストを書いています。既にテキストがあるreference_imageと同じですか? 'identicalImages'がfalseに設定されているときのxとyの値は何ですか?あなたのピクセル比較が失敗した場合、それらがどれも同じであることをどのように知っていますか? –

+0

はい、あなたは正しいです。 reference_imageは、コード内で生成しているイメージと同じ方法で生成されたため、両方とも同じです。テキストを書き込んだ後でイメージをディスクに保存してから読み直すと、ピクセル単位の比較がパスします。 – turingcomplete

関連する問題