Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

通信した画像データをそのまま表示させる方法?

Java6ヶ月初心者です。(よく参考にさせていただいております)

サーバーから連続したJPEG画像データを受信し、そのままファイル記録する簡易クライアントソフトが完成しました。
この画像ファイルを保存して再度読み込みせず、そのまま受信した画像を逐一表示させる方法が全くわかりません。

また、画像記録と同時に画像を表示する方法はあるのでしょうか?

以上について恐れ入りますがご教示ください。


ソース抜粋(クライアント 記録ソフト)
−−−−−−−−−−−−−−−−−−−−−−

//(1)ソケットを生成
Socket socket = new Socket(camAdd, camPort);

//(2)出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

//(3)入力ストリームを取得
BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),512);
    ・
    ・
 (以下サーバーに画像送出コマンドを送信)
    ・
    ・
//FileOutputStreamオブジェクトの生成
BufferedOutputStream fo = new BufferedOutputStream(new FileOutputStream(filename));

//JPEG画像書き込みルーチン

byte buf[] = new byte[4];

fo.write(0xff);//0XFFスタートマーク書き込み
fo.write(0xd8);//0XD8スタートマーク書き込み

    int len;
out:while ((len = in.read(buf)) != -1 ){//データがなくなるまで読み込みループ

    fo.write(buf,0,len);//JPEGデータの書き込み
    clear=5;break out;
    }// out

    int contents;
outx:while ((contents = in.read()) != -1 ){//データがなくなるまで読み込みループ

    fo.write(contents);//JPEGデータの書き込み(エンドマーク0XFF書き込み)

    if ( contents == 0xff ) {
         if ((d9con = in.read()) == 0xd9 ) {
             clear=6;break outx;
         } else {
             clear=5;
         fo.write(d9con);//0XFF--0XD9違い書き込み

     }
     }
     }// outx
            
     //JPEG画像書き込みルーチン
     fo.write(d9con);
     fo.close();
    ・
        ・
  (以下省略)

17

回答

7816

閲覧

17件の回答

評価

0

すみません。
画像表示のソース部分が抜けておりました。
大変失礼いたしました。

以下ソース抜粋
−−−−−−−−−−−−−−−−−−−−

try{//ファイル名を指定してFileオブジェクト生成、そこから画像を読む

     image=ImageIO.read(new File(eee));
     System.out.println("画像表示中・・・");
   } catch(IOException e) {
     System.out.println("     ファイル読み込みエラーです");

   }
     
     }
     
     
     public void actionPerformed(ActionEvent e){
        repaint();
        
     }
     
     
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image,0,0,this);
        }
     ・
    (省略ファイル調査部分)
     ・
        
     public static void main(String[] args){
      JFrame frame = new JFrame("写真データ");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      for (int xxx=0;xxx<datasuu;xxx++){
      Image22 h =new Image22(jpegdata[xxx]);
      frame.add(h,BorderLayout.CENTER);
      frame.setSize(648,514);
      frame.setVisible(true);
      
      }
      
      
  }
  }
  
  

評価

0

メモリに余裕をもたせてByteArrayStreamを使えばできそうですが、どうでしょう。

評価

0

ImageIO#read()が知ってるんなら、
引数になにが使えるのかくらい、確認しろよ。

ついでに。

Image22のコンストラクタでなにをやってんのか、わからんのだがね。
引数も怪しいし。画像データを何枚ももってんのか?

BufferedStreamを作っているのに、
バイト単位で読み出してちゃ、意味ないぞ。

Streamが0xffを吐いた後、さらにデータが取れる、
なんて話は、聞いたことがないんだがな・・・。

評価

0

EOFと0xffを混同していたわ。orz
失礼。

評価

0

>BufferedStreamを作っているのに、
>バイト単位で読み出してちゃ、意味ないぞ。
バッファ使ってないと思ってる?

評価

0

>メモリに余裕をもたせてByteArrayStreamを使えばできそうですが、どうでしょう。

B-G様ご指南ありがとうございます。
早速、ByteArraStreamを調べて挑戦してみます。
(クライアントPCは「エーサー:Aspire one」で1GB固定です)

>BufferedStreamの件

不良社員様、$様ありがとうございます。
ご指摘通りです。
初めにBufferedstreamも使用せず、1Byte単位でプログラムしてたのです。それでBufferedStreamに変更すると早くなりました。
が、もっと早くするにはといろいろ付け足してテストしておりました。
そのうち4Byteづつが1番早かったので、曖昧が更に曖昧となり、結局理解できずというのが現状でした。
これで1つ確信がもてました。ありがとうございます。
(多分、無線LAN環境や画像サイズが色々あり、その時ちょうど大きな画像を引っぱっていたのかも知れません。


因みに、画像データは大きさもまちまちでたくさんあり、これをサーバーから引き取って、リアルタイムに表示したいのです。

評価

0

>$氏
>バッファ使ってないと思ってる?

システムが、という意味だったら、そこまでは考えてないなあ。

>kankan氏
ImageIO#read()とsocket#getInputStream()だけで、
片がつくと思うよ。
Streamが吐き出すのが、画像データだけだったらね。

評価

0

>システムが、という意味だったら、そこまでは考えてないなあ。
いや、BufferedInputStreamのread()はフィールドのbufferから返しているってこと。

評価

0

をを、見落としておりました。m(_ _)m

評価

0

試行錯誤しましたが、結局、理解できず、結果以下で完全に煮詰まっております。
大変恐縮ですが、再度ご教示お願できないでしょうか。

ByteArraystreamの場合での現状(B-G様)

一旦、ソケットからバッファしたデータ(in.read())をそのままファイルに記録すると同時に(ここまではOK完了分で、以下不透明部分)、そのデータをそのまま配列に書込み、0XFF0XD8からOXFFD9までの1枚の画像の処理が終わったところで、
byte[] bytes = byteArrayOutputStream.toByteArray();で
?配列に読み込んで・・・・
?これをimageio.read()のstreamにつなげて(どうやって??)・・・画像表示する?
(これで流れは合っているかも疑問です)

結局、堂々巡りをしておりました。
どうかご教示ください。
以下、今回その途中経過のソース抜粋です。
大変長くなりますが、何卒よろしくお願いいたします。

−−−−−−−−−−−−−−−−

  (サーバーから画像データのみが連続して送られてくる)

JFrame frame = new JFrame("画像データ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ・
    ・
    ・

//FileOutputStreamオブジェクトの生成
  BufferedOutputStream fo1 = new BufferedOutputStream(new FileOutputStream(filename+"/"+no+".jpg"));
            
//ByteArrayOutputStreamオブジェクトの生成
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

//JPEG画像書き込みルーチン            
  fo1.write(0xff);//0XFFスタートマーク書き込み

  byteArrayOutputStream.write(0xff);
 fo1.write(0xd8);//0XD8スタートマーク書き込み
  byteArrayOutputStream.write(0xd8);

   int contents;
    int kcount=0;
    outx:while ((contents = in.read()) != -1 ){//データがなくなるまで読み込みループ

    fo1.write(contents);//JPEGデータの書き込み(エンドマーク0XFF書き込み)

  byteArrayOutputStream.write(contents); 

  if ( contents == 0xff ) {
       if ((d9con = in.read()) == 0xd9 ) {
             clear=6;break outx;
       } else {
               clear=5;
               fo1.write(d9con);//0XFF--0XD9違い書き込み
       byteArrayOutputStream.write(d9con);
                             }
                          }
                    }// outx--------
            
            //JPEG画像書き込みルーチン
            fo1.write(d9con);
            byteArrayOutputStream.write(d9con);
            //fo1.clearBuffer();
            fo1.close();
            clear=7;

            loop=loop+1;

// 書き込まれたバイトデータをbyte型配列として取得
   byte[] bytes = byteArrayOutputStream.toByteArray();
   for ( int iCounter = 0; iCounter < bytes.length; ++iCounter )                   
                 
        
   try{//ファイル名を指定してFileオブジェクト生成、そこから画像を読む
    image=ImageIO.read(????);
       } catch(IOException e) {
    System.out.println("     ファイル読み込みエラーです");
    }
     ?
     ?
     ?
      frame.add(h,BorderLayout.CENTER);
      frame.setSize(648,514);
      frame.setVisible(true);

評価

0

>煮詰まっております。
それは行き詰まってだ。

ImageIO#read()の引数はファイルだけじゃない。
まずはそこからだ。
そして、「出力」のようなものには必ず対になるものがある。

評価

0

$様、ご回答ありがとうございます。
以下がぐちゃぐちゃになった私の頭の中です。

>ImageIO#read()の引数はファイルだけじゃない。

imageioクラスのread()メソッドを使用し、その引数にinputstream inputをとると思うのですが、APIに「現在登録されているものの中から自動的に選択された ImageReader を使用して、指定された InputStream を復号化した結果として、BufferedImage を返します。」とあり、ここでimagereader(登録してるかどうか理解できない)を登録していると仮定してもinputstreamをbytearrayinputstreamに代入したとしても・・・。
返値がbufferedimageになってしまい、どう解釈すれば良いのでしょうか?

>そして、「出力」のようなものには必ず対になるものがある。

imageioの中の出力のようなものだと解釈しておりますが、createimageoutputstream(object output)でしょうか?
これから画像が表示されるようなイメージがAPIに内容に思います。
また、imageioのwriteメソッドやgetimagewriterメソッドにしてもしっくりきません。

コケまっくております。
どうかご教示ください。

評価

0

>どう解釈すれば良いのでしょうか?
画像を表示させたいんじゃなかったのか?
BufferedImageを表示させればいいじゃないか。
ImageIOの元がFileだろうとbyte[]だろうと同じことだろう。

>imageioの中の出力のようなものだと解釈しておりますが、
いや、これはByteArrayOutputStreamに対するByteArrayInputStreamのこと。

それと、面倒がらずにクラス名は正確に書くことだ。
読みづらくて仕方ない。

評価

0

$様、ありがとうございます。
じっくり見てみます。

>それと、面倒がらずにクラス名は正確に書くことだ。
読みづらくて仕方ない。

これから気をつけます。

評価

0

>ImageIO#read()の引数はファイルだけじゃない。

ImageIO#read()で引数をByteArrayInputStreamで画像をbyte[]でストリーム入力させ、

>そして、「出力」のようなものには必ず対になるものがある。
creategraphics()メソッドでBufferedImageへ描画するためにGraphics2Dを作成する。

大きな流れ流れは以上のようになるのでしょうか?
 

評価

0

>大きな流れ流れは以上のようになるのでしょうか?
書いてる時間があったら手を動かす。

評価

0

$様、皆様ありがとうございました。
まだ壁がたくさんあり、大分時間がかかると思いますが、また質問させていただきます。

初めての掲示板でドキドキしました。。。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。