0

我知道图像是有效的,因为我可以将 IplImage 转换为图像,甚至可以在 JPanel 上绘制它。但是,当我将字节数组转换为图像时,大多数时候我都会得到对图像的空引用。查看下面的代码以了解我所面临的情况,欢迎评论、问题、答案,甚至欢迎提示。

            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 可以写入 OutputStream,例如写入 ByteArrayOutputStream,您可以从中获取字节。另一方面,ImageIO 可以再次读取它。这不是您想到的纯像素数据,而是万无一失的。

于 2012-04-22T02:10:22.123 回答