int2byte
- 256x256で24bppなカラー画像ファイルを BufferedImage に読み出す
- 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 秒)