2012-04-21 12 views
0

IplImageをImageに変換してJPanelに描画することもできるため、画像が有効であることが分かります。しかし、バイト配列をImageに変換すると、ほとんどの場合、Imageへのnull参照が返されます。下のこのコードを見て、私が直面していること、コメント、質問、回答はすべて歓迎され、ヒントも大歓迎です。ImageIO.readが100%有効であるにもかかわらず、nullが返されることがあります

  Image i = Convert.getImage(image); 
      byte[] buffer = Convert.getBytes(image); 
      Image i2 = Convert.getImage(buffer); 
      //i2 is a null reference and i is a valid image. i can be drawn but i2 is useless. 

変換クラス:私はバイト配列として必要なのですか、なぜ

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package Security; 

import com.googlecode.javacv.cpp.opencv_core.IplImage; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.io.ByteArrayInputStream; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageReader; 

/** 
* 
* @author danny 
*/ 
public final class Convert 
{ 

     public static Image getImage(IplImage image) 
     { 
       return image.getBufferedImage(); 
     } 

     public static byte[] getBytes(IplImage image) 
     { 
       byte[] buffer; 
       BufferedImage bI = image.getBufferedImage(); 
       buffer = ((DataBufferByte) (bI).getRaster().getDataBuffer()).getData(); 
       return buffer; 
     } 

     public static String getString(byte[] buffer) 
     { 
       return new String(buffer); 
     } 
     public static Image getImage(byte[] buffer) 
     { 
       try 
       { 

         Image i = ImageIO.read(new ByteArrayInputStream(buffer)); 
         return i; 
       } 
       catch (Exception e) 
       { 
         System.out.printf("Exception Message:\n%s", e.getMessage()); 
         return null; 
       } 

     } 
} 

今、あなたのいくつかは求めることができます。私はネットワークを介して送信する必要があります。注意する

エクストラもの:

  1. 例外が
  2. IplImageでは、有効なオブジェクト

でアップデートスローされていない:

を私が使用して試してみましたToolKitクラスを使用して、バイト配列からイメージを作成します。しかし、おそらくJPEGやGIFではないので失敗します。有効なImageオブジェクトを返しても、Imageオブジェクトは空のイメージを指しています。ここでは、私が使用しようとしていたが、そうしなかったコードがあります。

public static Image getImage(byte[] buffer) 
{ 
     try 
     { 
       Toolkit toolkit = Toolkit.getDefaultToolkit(); 
       Image i = toolkit.createImage(buffer); 
       return i; 
     } 
     catch (Exception e) 
     { 
       System.out.printf("Exception Message:\n%s", e.getMessage()); 
       return null; 
     } 

} 
+0

あなたはそこに「例外」を捕まえています。どんな運がそれを捕まえる?それは何かをプリントアウトしますか? –

+0

例外はスローされていません。私はおそらくそれを言及することを忘れた。 –

+0

脇のコメントだけ: 'getString'はどこでも機能しません。 OSのエンコーディングを使用し、UTF-8の下で壊れてしまい、Stringにいくつかの問題があります(nul、lineendings)。 –

答えて

2

DataBufferByte.getDataは次のようになります。 "デフォルトの(最初の)バイトデータ配列を返します。"最初の銀行です。これは、バイトを取得する不確実で不完全な方法のようです。特に途中で。 DataBufferからDataBufferByteへの実装依存のキャストがあります。

ImageIOは、例えばバイトを取ることができるByteArrayOutputStreamなどのOutputStreamに書き込むことができます。そしてもう一方の側では、ImageIOはそれを再び読み取ることができます。それはあなたが念頭に置いていただけの純粋なピクセルデータではありませんが、ばかではありません。

+0

これを読む前にすでに私はそれを解決しました。あなたの答えをありがとう、getBytes(IplImage)が不正なバイト配列を返すため、私は実際にそれを解決しました。だから私はImageIO.writeを答えの中で述べたように使った。あなたが私を助けてくれてとても元気だったので、私はあなたを答えとして記します。助けてくれてありがとう! :) –

関連する問題