Javaによる画像ファイルの扱い

Javaで画像ファイルを扱いたかったので、その時の調査メモ

画像の読み書き

「ImageIO.read」で読み込み、「ImageIO.writ」で書き込む。

// 画像の読み込み
BufferedImage img = ImageIO.read(new File("foo.png"));

// 画像の書き込み
ImageIO.write(img, "gif", new File("hoo.gif"));

なお、読み込み・書き込み時に指定できるフォーマットは以下の方法で取得可能。

// 読み込み可能な画像フォーマット
System.out.println("Reader:");
for(String s : ImageIO.getReaderFormatNames()) {
	System.out.println("  " + s);
}

// 書き込み可能な画像フォーマット
System.out.println("Writer:");
for(String s : ImageIO.getWriterFormatNames()) {
	System.out.println("  " + s);
}

画像の幅・高さの取得

高さや幅はBufferedImageのメソッドから取得可能。

// 幅、高さの取得
System.out.println("Width:"  + img.getWidth());
System.out.println("Height:" + img.getHeight());

画像の編集

BufferedImageに対し、「createGraphics」を適用する事で「Graphics2D」が取得できるため、それを使用して色々と弄ることができる。

// 画像の編集
Graphics2D g2 = img.createGraphics();
g2.setPaint(Color.BLUE);
g2.fillRect(10, 10, 30, 30);
g2.dispose();

上の例では、青い四角形の描画を行っている。むろん、色々な図形を描いたりすることが可能。

新しい描画領域の確保

BufferedImageを新たに作成すれば、新たな領域を使用して色々と弄れる。

// 新たなバッファの確保
BufferedImage img2 = new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = img2.createGraphics();
//色々と画像を編集して

ImageIO.write(img2, "png", new File("aa.png")); // 保存

画像のピクセル単位の直接編集

「getRGB」と「setRGB」を使用することで、画像データをピクセル単位で編集することができる。

// 読み込み
int argb = img.getRGB(53, 20);
int a = (argb>>>24) & 0xff;
int r = (argb>>>16) & 0xff;
int g = (argb>>> 8) & 0xff;
int b = argb        & 0xff;
System.out.println("a:"+a+" r:"+r+" g:"+g+" b:"+b);

// 編集
b = b * 50 % 256;

// 書き込み			
img.setRGB(50, 20, a<<24|r<<16|g<<8|b);