画質を考える

拡大すると

拡大すると円の周りのギザギザが気になります。

EventRandom

BufferedImageをパネルより大きくして常に縮小すれば良くなるでしょうか

BufferedImageを大きくし、パネルにコピーするとき縮小(失敗編)

パネルのコンストラクタで2倍の大きさのBufferedImageにしてみます。

public MyPanel(int width, int height){
    setPreferredSize(new Dimension(width,height));
    buffimg = new BufferedImage(
        width*2, height*2, BufferedImage.TYPE_INT_RGB);
    bfg = buffimg.createGraphics();
    bfg.setColor(bgcolor);
    bfg.fillRect(0, 0, width*2, height*2);
}

最後の2行は背景色を塗っている部分です。これも広くしないとなりません。

次のようになります。

EventRandom

この失敗は円の描画部分drawToBuff()メソッドに400,300が直に書いてあるからです。この400,300はBufferedImageの大きさの範囲という意味ですから今回は800,600にすべきです。

int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
int h = (int)(50*Math.random()+5);

800,600以外にしても直さなくても良いようにbuffimg.getWidth(), buffimg.getHeight() にしておきます。

int x = (int)(buffimg.getWidth()*Math.random());
int y = (int)(buffimg.getHeight()*Math.random());
int h = (int)(buffimg.getWidth()*Math.random()/8+buffimg.getWidth()/80);

大きさも400で50の割合なら800で100にすべきです。つまりwidthの1/8とします。先に割ると切り捨てで誤差が出ますから後で割ります。最低幅の5も幅の1/80とすると同じ割合に拡大できます。

BufferedImageを大きくし、パネルにコピーするとき縮小(成功)

左上の数字が小さいので大きく描いて縮小していることがわかります。あまり変わっていません。

EventRandom

GIMPで400%に表示したもので比較します。

パネルが400x300 パネルを4倍に拡大
BufferedImage
1600x1200
EventRandom
400x300のパネルに1/4に縮小して表示
EventRandom
4倍(1600x1200程度)のパネルに表示(およそ等倍)
BufferedImage
400x300
EventRandom
400x300ののパネルに等倍表示。
EventRandom
4倍(1600x1200程度)のパネルに表示(およそ4倍)
結論 BufferedImage よりパネルが小さい時には
ギザギザの大きさはどちらも1ピクセルで
良くなりません
BufferedImage よりパネルを大きくした時に
ギザギザが強調されるのを抑えることができます

setRenderingHintを使う

setRenderingHintのみ(BufferedImageは400x300)

setRenderingHintを使うにはまず Graphics でなく Graphics2D クラスを使います。

public class MyPanel extends JPanel{
    BufferedImage buffimg;
    Graphics2D bfg;

Graphics2D クラスのインスタンスにsetRenderingHintでアンチエイリアスの設定をします。

buffimg = new BufferedImage(
          width,height,BufferedImage.TYPE_INT_RGB);
bfg = buffimg.createGraphics();
bfg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON);
bfg.setColor(bgcolor);
bfg.fillRect(0, 0, width, height);
EventRandom
setRenderingHint
EventRandom
setRenderingHint

setRenderingHint + BufferedImage 2倍

BufferedImage 2倍

       public MyPanel(int width, int height){
            setPreferredSize(new Dimension(width,height));
            buffimg = new BufferedImage(
                width*2,height*2,BufferedImage.TYPE_INT_RGB);
            bfg = buffimg.createGraphics();
            bfg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON);
            bfg.setColor(bgcolor);
            bfg.fillRect(0, 0, width*2, height*2);
EventRandom
BufferedImage x2
EventRandom
BufferedImage x2

setRenderingHint + BufferedImage 4倍

BufferedImage 4倍

       public MyPanel(int width, int height){
            setPreferredSize(new Dimension(width,height));
            int r=4;
            buffimg = new BufferedImage(
                width*r,height*r,BufferedImage.TYPE_INT_RGB);
            bfg = buffimg.createGraphics();
            bfg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON);
            bfg.setColor(bgcolor);
            bfg.fillRect(0, 0, buffimg.getWidth(), buffimg.getHeight());
        }
EventRandom
BufferedImage x4
EventRandom
BufferedImage x4

比較

0. EventRandom
setRenderingHint
EventRandom
setRenderingHint
1. EventRandom
setRenderingHint
EventRandom
setRenderingHint
2. EventRandom
BufferedImage x2
EventRandom
BufferedImage x2
3. EventRandom
BufferedImage x4
EventRandom
BufferedImage x4

課題

上記プログラムをつくって動作を確認しなさい。

ファイル名 EventRandom6.java

余計な話

RenderingHint

setRenderingHintが使えるのは線や楕円などの図形を描くときであって、 drawImage()メソッドで次のようにしても効果がない。

      public void paintComponent(Graphics g){
         Graphics2D myg = (Graphics2D)g;
         pcct++;
         myg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON);
         int pnlw = getSize().width;
         int imgh = buffimg.getHeight() * pnlw / buffimg.getWidth();
         myg.drawImage(buffimg, 0, 0, pnlw, imgh, this);

EventRandom
BIx4
EventRandom
BIx4
EventRandom
BIx4
EventRandom
BIx4
もくじ

Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Oct.2010 Oct.2012