int2byte

  1. 256x256で24bppなカラー画像ファイルを BufferedImage に読み出す
  2. Raster を介して int[] に取り出す

取り出した int を byte に変換したい.http://java-house.jp/ml/ に答があった.

short → byte[]

b[0] = (byte)((v >>>  8) & 0xFF);
b[1] = (byte)((v >>>  0) & 0xFF);

int → byte[]

b[0] = (byte)((v >>> 24) & 0xFF);
b[1] = (byte)((v >>> 16) & 0xFF);
b[2] = (byte)((v >>>  8) & 0xFF);
b[3] = (byte)((v >>>  0) & 0xFF);
http://java-house.jp/ml/archive/j-h-b/043190.html#body

今回私が扱っている画像においては,画素の最大値は255で,最小値は0だ.ゆえに (byte)(v & 0xFF) だけでいい.それどころか,ただ単にキャストするだけで良かった.テストコード test.java の実行結果で,226 を変換した場合 -30 となっている.これは byte が signed だからだ.加減算をするわけではないから放置する.

以上で判明したことを基に,int2byte を作る.入力は int 配列で,出力は byte 配列とする.

test.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package test;

import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

/**
 *
 * @author Guernsey
 */
public class test {
	public static void main(String[] args)
	 {
		BufferedImage image;
//		image = new BufferedImage(256,256,BufferedImage.TYPE_3BYTE_BGR);
		image = loadImage("lena.png");
		Raster ras = image.getData();
		int num = 100;
		int[] a = new int[num];
		a = ras.getPixels(0, 0, num, 1, (int[])null);
		byte[] b = new byte[num];
		System.out.println((byte)(a[0]) + " " + a[0]);
		b = int2byte(a);
	}

	private static byte[] int2byte(int[] a) {
		throw new UnsupportedOperationException("Not yet implemented");
	}

	private static BufferedImage loadImage(String filename) {
	InputStream is = null;
		try {
			is = new FileInputStream(filename);
			BufferedImage img = ImageIO.read(is);
			return img;
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (is != null) try { is.close(); } catch (IOException e) {}
		}
	}
}

デバッグ実行結果

debug:
-30 226
Exception in thread "main" java.lang.UnsupportedOperationException: Not yet implemented
        at ldhsjava.test.int2byte(test.java:35)
        at ldhsjava.test.main(test.java:31)
Java Result: 1
構築成功 (合計時間: 2 秒)