- - PR -
Graphics2D#drawImage()の挙動について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-06 11:53
はじめまして。掲題の件についてご質問いたします。
Java2Dを初心者のため、よく理解できていないのが現状です。 長文となり申し訳ありませんが、ご助力いただけますようお願いいたします。 【現象概要】 2つのBufferedImageがあり、一方から他方へGraphics2D#drawImage()を使用して画像を書き込む。 このとき、書き込んだ画像と異なる画像が作成される。 下記のimage1(対角線)の画像とならずに、階段状の画像が作成されます。 後述の【実行結果】を参照ください。 【BufferedImageの説明】 ・BufferedImageの1(image1) 白地に右上隅から左下隅へかけて、黒の対角線が描かれている。 BufferedImageの構成は以下の通り width, height = 16 imageType = BufferedImage#TYPE_BYTE_BINARY IndexColorModel bits = 1 size = 2 r, g, b = byte[]{(byte)255, 0} ・BufferedImageの2(image2) すべて白地。 BufferedImageの構成はimage1と同じ 【質問】 どのような理由により上記現象が発生しているかご教授ください。 回避手段があるようでしたらご教授願います。 【補足】 ・BufferedImageのIndexColorModelのr,g,bを「byte[]{0, (byte)255}」とすると上記現象は発生しません。 ・BufferedImageのsetRGB()、getRGB()を使用すれば上記現象が起きないのは確認できているのですが、上記現象の発生理由がわからないので、知りたい限りです。 ・RenderingHints、BufferedImageOpを色々と試したのですが、現状と変わりませんでした。 【環境】 JDK1.4.2_06(少々古いですが、他の制約のためVer変更できず) 【コード】
【実行結果】 image1 -------------------------------- 0000000000000001 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000 -------------------------------- image2 -------------------------------- 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 -------------------------------- image2 <- image1. -------------------------------- 0000000011111111 0000000011111110 0000000011111100 0000000011111000 0000000011110000 0000000011100000 0000000011000000 0000000010000000 1111111100000000 1111111000000000 1111110000000000 1111100000000000 1111000000000000 1110000000000000 1100000000000000 1000000000000000 -------------------------------- | ||||||||
|
投稿日時: 2007-04-06 13:16
1.6.0 あたりで試してみましたが、この現象が起きました。 提示されたソースコードを見てみましたが、私にはこの現象がソースコードに起因して起きているとは思えませんでした。(もっとも IndexColorModel は使った経験がないのですが。) image2 に drawImage した直後の時点で、その内容がおかしいようです。image2 を JPanel などに paint してもやはり階段状に表示されます。 Java2D のバグなんじゃないでしょうか。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-04-06 13:24
私の環境でも発生しましたが…
気になる点が少々。
この部分と、TYPE_BYTE_BINARY のjavadocの以下の部分です。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/image/BufferedImage.html#TYPE_BYTE_BINARY
憶測ですが、 drawImageの過程でColorModelがTYPE_BYTE_BINARYのまま処理されるのではなく ほかのカラーモードで処理された後に変換されているのではないだろうか? と思いました。 (でもBufferedImageってそういうものだったっけ?) ちゃんとソースを追わないと原因究明はできなさそうですが さすがにそこまで手を出している時間が今はとれませんね… | ||||||||
|
投稿日時: 2007-04-06 17:27
お世話になります。
unibonさん、nagiseさん、ご確認ならびにご返答いただきましてありがとうございました。 また調査まで頂きまして本当にありがとうございます。 Java2Dの初心者ということもあり、バグの疑いは持っておりませんでした。 (私の知識不足が原因との認識でした。) 簡単にSunのBug Databaseの検索を行いましたところ、IndexColorModelでの色変換に関して、問題がいくつか残っているようです。 この後、もう少し詳細に調べてみたいと思います。 あとはソースも追ってみたいと思います。 何かわかりましたら、こちらに記載させていただきます。 以上、ありがとうございました。 |
1