java画像関連

個人的メモ。

ImageIO + BufferedImage


ImageIOで読む。

BufferedImage bufferedImage = ImageIO.read(inputStream);


ImageIOで書く。

ImageIO.write(bufferedImage, "png", outputStream);

なお、どんなpngでも書き込めるようになったのは、JDK5.0のupdate8から。
あと、gifがwriteできるのはJDK6.0から。
それ以前でwriteしたい場合は自分でGIFフォーマットを見て実装するか、「GIFEncoder java」で検索するとフリーのが結構出てきたりするのでそれを使うなどなど。


ついでに、このwriteのoutputStreamにByteArrayOutputStreamを指定しておけば、ByteArrayOutputStream#toByteArray()でbyte配列が取れるのでオススメ。

BufferedImage + Graphics2Dで透明画像

BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
graphics2D.setColor(new Color(0x0000000, true));
graphics2D.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());
graphics2D.dispose();


で、透明画像を作成できる。
graphics2D#setColorで、色指定の際、

new Color(0x00000000)	

のようにtrueを入れないと、強制的に不透明になる。
何せ中で

value = 0xff000000 | rgba;

とかやっているので。true重要。

Kernel + BufferedImageOpでfilter

Kernelで行列作って、BufferedImageOpにいれ、filterをかける。

Kernel kernel = new Kernel(3, 3, new float[] {
1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f, 
1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f,
1.0f / 9.0f, 1.0f / 9.0f, 1.0f / 9.0f});
BufferedImageOp imageOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
imageOp.filter(input, output);

〜Op系はいろいろ使えるものが多いようなのでよく調べてみたいところ。