TexturePaintクラスによるテクスチャーによる塗りつぶし

広告

主に塗りつぶし用としてテクスチャーを使って塗りつぶす方法を確認します。「setPaint」メソッドの引数にTexturePaintクラスのオブジェクトを指定します。

クラス図は次のようになっています。

  • java.lang.Object
  • java.awt.TexturePaint
  • public class TexturePaint extends Object implements Paint

コンストラクタは1つだけ用意されています。

コンストラクタ
TexturePaint(BufferedImage txtr, Rectangle2D anchor)
TexturePaint オブジェクトを構築します。

1番目の引数に塗りつぶす元となる画像を表すBufferedImageクラスのオブジェクトを指定します。(BufferedImageクラスについては『BufferedImageの使い方』を参照して下さい)。

1番目の引数で指定した画像を塗りつぶす領域いっぱいに並べていくことであたかも画像を使って塗りつぶしたようにすることが出来ます。その時読み込んだ画像のオリジナルの大きさで使用するのではなく、2番目の引数で指定した大きさに調整した上で塗りつぶしが行われます。

2番目の引数であるRectangle2Dクラスは位置とサイズの情報を保存するためのクラスです。始点の座標(x, y)と大きさ(width, height)の情報を持ちます。Rectangle2Dクラスはabstractクラスであるため実際にはサブクラスであるRectangle2D.DoubleクラスやRectangle2D.Floatクラスを使います。詳しくは『Rectangle2Dクラス』を参照して下さい。

具体的には次のように記述します。

public void paintComponent(Graphics g){
  Graphics2D g2 = (Graphics2D)g;

  BufferedImage img = 
    new BufferedImage(45, 59, BufferedImage.TYPE_INT_RGB);

  File f = new File("./img/sample.png");
  try {
    img = ImageIO.read(f);
  }catch (IOException ex){
    ex.printStackTrace();
  }

  Rectangle2D.Double rec = 
    new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight());

  g2.setPaint(new TexturePaint(img, rec));

  g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
}

「setPaint」メソッドを実行した後で実行された「draw」メソッド及び「fill」メソッドで設定が反映されます。

サンプルプログラム

簡単なサンプルを一度試してみます。

※今回使用させて頂いた画像は『牛飼いとアイコンの部屋』で公開されている画像を使用させて頂いています。

PaintTest4.java

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class PaintTest4 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    PaintTest4 app = new PaintTest4();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;

    BufferedImage img = 
      new BufferedImage(45, 59, BufferedImage.TYPE_INT_RGB);

    File f = new File("./a_horse.gif");
    try {
      img = ImageIO.read(f);
    }catch (IOException ex){
      ex.printStackTrace();
    }

    Rectangle2D.Double rec = 
      new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight());

    g2.setPaint(new TexturePaint(img, rec));

    g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

テクスチャーを使って塗りつぶし

今回はオリジナルの画像サイズのまま領域内に並べて表示しました。

ではもう1つ試してみます。同じ画像ファイルを使用していますが今度はサイズを1/2に縮小した状態で塗りつぶしてみます。

PaintTest5.java

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class PaintTest5 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    PaintTest5 app = new PaintTest5();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;

    BufferedImage img = 
      new BufferedImage(45, 59, BufferedImage.TYPE_INT_RGB);

    File f = new File("./a_horse.gif");
    try {
      img = ImageIO.read(f);
    }catch (IOException ex){
      ex.printStackTrace();
    }

    Rectangle2D.Double rec = 
      new Rectangle2D.Double(0, 0, img.getWidth() / 2, img.getHeight() / 2);

    g2.setPaint(new TexturePaint(img, rec));

    g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

テクスチャーを使って塗りつぶし

( Written by Tatsuo Ikura )