InputStream
OutputStream
があれば、バイト列を転送できる
http://d.hatena.ne.jp/winebarrel/20070427/p2
private static void pipe(InputStream in, OutputStream out) throws IOException {
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) > 0)
out.write(buf, 0, len);
}
}
これらの子クラスがいっぱいある。
FileInputStreamとか
ImageInputStream、ImageOutputStreamとか。
Image系は、ImageIO.createImageInputStream()とか使ってストリームを作るみたい。
コレダ!
http://www.java-forums.org/new-java/11704-image-byte.html
boolean ImageIO.write(RenderedImage im, String formatName, OutputStream output); という関数が使えそう
がんばってたら、できた。
送信側
//送信する生データ(BufferedImage)
BufferedImage img = new Robot().createScreenCapture(new Rectangle(0, 0, 240, 150));
//バイト列出力のためのストリーム
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//baosに出力。とりあえずJPEGで。IOException例外が投げられる
try {
ImageIO.write(img, "JPEG", baos);
} catch (IOException e) {
e.printStackTrace();
}
//送信するバイト列
byte[] sendData = baos.toByteArray();
受信側
//受信したバイト列。sendDataと同じもの
byte[] receiveData = receivepacket.getData();
//それを元にImageIconを作るだけ。JPEG,PNG,GIFなどなら、ピクセル配列からImageIconを作成できる
ImageIcon icon = new ImageIcon(imageData);
バイト列からImageIconを作る方法はあるけど、バイト列からBufferedImageを作ることはできないみたい?綱渡りだね
注意点としては、送信側のBufferedImageのサイズと、受信側のImageIconを表示するサイズが同じでないといけない。
(今回の場合、ここには書いていないけど、JLabel.setIcon(icon);として描画した。そのlabelのサイズを、BufferedImageと合わせる必要があった)
でないと、画像が灰色になっちゃった。
ちなみに、送受信しない場合
BufferedImage img = new Robot().createScreenCapture(new Rectangle(0, 0, 240, 150));
ImageIcon icon = new ImageIcon(img);
となる。
javaのstreamをちゃんと分かる必要があるな。
毎回頭を悩ませてる。
PR