我知道图像是有效的,因为我可以将IplImage转换为图像,甚至可以在JPanel上绘制它。但是当我将一个字节数组转换为一个Image时,大部分时间我都会得到一个Image的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;
}
}
}
现在有些人可能会问我为什么需要作为字节数组。好吧,因为我需要通过网络发送。
需要注意的额外事项:
更新
我尝试使用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 :(得分:2)
DataBufferByte.getData将:“返回默认(第一个)字节数据数组。”第一个银行就是。这似乎是获取字节的不确定,不完整的方法;特别是在回来的路上。此外,还有从DataBuffer到DataBufferByte的实现依赖转换。
ImageIO可以写入OutputStream,例如写入ByteArrayOutputStream,您可以从中获取字节。另一方面,ImageIO可以再次读取它。这不是你想到的纯粹的像素数据,而是万无一失的。