■画像オブジェクトの例■

では,実際に画像オブジェクトを作成してみよう.

演習課題6

次のような画像クラスを作成せよ.

public class Image
{
  int width;
  int height;
  int [][] data;

  public void Image(int w, int h)
  {
  }
  
  public int getWidth()
  {
    //このオブジェクトの幅を返すこと
  }
  public int getHeight()
  {
    //このオブジェクトの高さを返すこと
  }
  public int setWidth(int w)
  {
    //このオブジェクトの幅を変更すること
  }
  public int setHeight(int h)
  {
    //このオブジェクトの高さを変更すること
  }
}

この画像は,一画素につきint型のデータをひとつだけ保持するような,グレースケール画像を想定している.このためのグレースケールデータと,画像の大きさ,それに対するアクセスメソッドが最低限必要である.

練習1: 各メソッドを作成し,画像クラスを完成させよ.
(ヒント: 幅・高さを変更したら画像データも確保しなおし.)
練習2: setData,getDataとして,座標(x,y)の画素データへのアクセスメソッドも作成せよ.

画像ファイルの読み込み・書き込み

Imageクラスに,次のメソッドを追加すること.詳しくは次回説明するが,とりあえず画像の読み書きができないと動作チェックができないため,今回はそのままコピーするだけでよい.使い方は,プロジェクトと同じフォルダにあるはずの画像ファイル名を引数に指定すればよい.

Image.javaファイルの先頭で
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

そしてImageクラスに次のメソッドを追加
public void loadImage(String filename)
{
  BufferedImage readImage=null;
  try {
    readImage=ImageIO.read(new File(filename));
  } catch(final IOException e) {
    System.out.println("ファイルがみつかりません");
    System.exit(0);
  }
  int w=readImage.getWidth();
  int h=readImage.getHeight();
  setWidth(w);
  setHeight(h);
  for(int y=0;y<h;y++)
    for(int x=0;x<w;x++)
    {
      int rgb = readImage.getRGB(x,y);
      int r = (rgb>>16)&0xff;
      int g = (rgb>>8)&0xff;
      int b =  rgb&0xff;
      setData(x,y,(int)(r*0.3+g*0.6+b*0.1));
    }
}

public void saveImage(String filename)
{
  int w=getWidth();
  int h=getHeight();
  BufferedImage writeImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

  for(int y=0;y<h;y++)
    for(int x=0;x<w;x++)
    {
      int gray = getData(x,y);
      int rgb = gray<<16|gray<<8|gray;
      writeImage.setRGB(x,y,rgb);
    }
  try {
    ImageIO.write(writeImage,"PNG",new File(filename));
  } catch(final IOException e) {
    System.out.println("ファイルがかけません");
    System.exit(0);
  }

}

画像処理練習

練習3: 全画像の白黒を反転するプログラムを作成せよ.
練習4(応用): 全画像の輪郭線を抽出するプログラムを作成せよ.

輪郭線の抽出には,Sobelフィルタなどが使用できる.