忍者ブログ
  • 2024.03
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.05
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/04/27 05:19 】 |
イメージをバイト列に変換してまた戻す
Imageをネットワークを通して転送したい。
BufferedImageか、Imageか、IconImageか、どれでも良いんだけど、
転送するときはbyte[]型で転送するから、どれかのオブジェクトをbyte[]に変換できるメソッドがあったら良かったんだけど、どれもできないみたい
(イメージの生データくらい、getData()とかgetBytes()みたいなので取れれば良いのに・・・)


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
【2011/06/13 02:36 】 | Java | 有り難いご意見(0) | トラックバック()
<<「東京の副知事になってみたら」 | ホーム | Javaでスクリーンショットを撮る方法>>
有り難いご意見
貴重なご意見の投稿














虎カムバック
トラックバックURL

<<前ページ | ホーム | 次ページ>>