0

IplImage を Image に変換し、JPanel に描画することもできるため、画像が有効であることはわかっています。しかし、ほとんどの場合、バイト配列を画像に変換すると、画像への 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;
        }

}
4

1 に答える 1

2

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

ImageIO は、バイトを取得できる ByteArrayOutputStream などの OutputStream に書き込むことができます。そして反対側では、ImageIO はそれを再び読み込むことができます。それはあなたが考えていた純粋なピクセルデータだけではありませんが、絶対確実です。

于 2012-04-22T02:10:22.123 に答える