Java ImageIO.read有时会重新运行null,即使我100%确定图像是100%有效的

Java ImageIO.read有时会重新运行null,即使我100%确定图像是100%有效的,java,javax.imageio,javacv,Java,Javax.imageio,Javacv,我知道图像是有效的,因为我可以将IplImage转换为图像,甚至可以在JPanel上绘制。但是,当我将字节数组转换为图像时,大部分时间我都会得到图像的空引用。查看下面的代码,了解我面临的问题,欢迎评论、问题、答案,甚至提示 Image i = Convert.getImage(image); byte[] buffer = Convert.getBytes(image); Image i2 = Convert.getIm

我知道图像是有效的,因为我可以将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;
                }

        }
}
现在你们中的一些人可能会问,为什么我需要一个字节数组。因为我需要通过网络发送

需要注意的额外事项:

/*
 * 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;
                }

        }
}
  • 没有抛出异常
  • IplImage是一个有效的对象
  • 更新:

    /*
     * 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格式。虽然它返回了一个有效的图像对象,但图像对象指向的是一个空白的图像。下面是我尝试使用但失败的代码

    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;
            }
    
    }
    

    DataBufferByte.getData将:“返回默认(第一个)字节数据数组。”这是第一个。这似乎是一种不确定的、不完整的获取字节的方法;尤其是在回来的路上。此外,还有从DataBuffer到DataBufferByte的依赖于实现的强制转换


    ImageIO可以写入输出流,例如ByteArrayOutputStream,您可以获取其中的字节。在另一边,ImageIO可以再次读取它。这并不是您心目中唯一的像素数据,而是傻瓜式的。

    您正在捕捉
    异常。运气好吗?它打印出什么了吗?没有抛出异常。我可能忘了提这一点。只需一句旁白:
    getString
    不会在任何地方都起作用。使用操作系统编码,将在UTF-8下中断,因为字符串有一些问题(nul,lineendings)。在阅读本文之前,我已经解决了它。感谢您的回答,我实际上解决了这个问题,因为getBytes(IplImage)返回的字节数组不正确。所以我使用了ImageIO。像你在回答中提到的那样写作。我会记下你的答案,因为你帮助我很好。谢谢所有帮助过我的人!:)