ツナドーナツ・技術メモ帳

色々なものを作る過程で分からなかったことなどを書いていきます

画像をJava→C言語のソケット通信で送りたかった

JavaからCに画像をソケット通信で送ろうとしたが失敗したのでメモ。

原因:画像のヘッダが紛れ込んでしまうため。

JavaではImageIO.read()で画像を読み込むことができます。読み込んだ画像はBufferedImage型の変数に格納します。

BufferedImage readImage = ImageIO.read(new ByteArrayInputStream("画像"));

↑ここで読み込んだものを扱いやすくするためにbyte型の配列に直します。

try{
byte byte_image = new byte;
ByteArrayInputStream bos = new ByteArrayInputStream();
BufferedOutputStream os = new BufferedOutputStream(bos);
imageIO.write(readImage, "png", os);
byte_image = bos.toByteArray();
}catch(Exception e){
}

これでbyte_imageにバイト型でreadImageが入ります。
ただこれ、どうやら画像ヘッダも一緒にバイト型に変換されて代入されているようです。
imageIO.writeは画像を書き込む関数なので、OpenCVのdataのように生データを取得するわけではないんです。そこを勘違いしていました。

Javaをしっかり理解していなかったがためのミスでした。
もはやソケットの問題ですらないです。

解決策としては、
画像ヘッダのチャンクとシグネチャを読むコードを組む
Java用のOpenCVを使ってdataを丸投げする
とかでしょうか。

めんどくさいので、これからはOpenCVで画像を丸投げすることにします(笑)