1

我已经检查了几个关于如何转换byte[]为的示例BufferedImage,但我似乎无法让它工作。我将图像转换为字节数组:

        BufferedImage b = null, c=null;
        try {
            b = ImageIO.read(Main.class.getResource("res/lvl/Medieval.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData();

然后我尝试将其转换回:

        ByteArrayInputStream bais = new ByteArrayInputStream(imageByteArray);

        try {
            c = ImageIO.read(bais);
        } catch (IOException e) {
            e.printStackTrace();
        }

c还在null这之后。我究竟做错了什么?

4

3 回答 3

3

你的代码行

byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData();

不会为图像创建有效的字节数组。

请改用此代码:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(b, "png", baos);
    byte[] imageByteArray = baos.toByteArray();
于 2013-06-08T21:43:06.387 回答
1

第一次转换后得到的是原始像素数据。不要使用 ImageIO(它可以读取序列化格式的图像),而是尝试进行与您所做的相反转换以首先制作字节数组。

通常是这样的:

    DataBufferByte buffer = new DataBufferByte(bytes, bytes.length);
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, scanline, bpp, bandOffsets, null), false, null);

但是,该图像将与第一张图像相同,因此我不确定您要在这里实现什么..?

PS:请注意,图像字节数组不会被克隆(除非您明确地这样做),因此图像将共享像素数据。

于 2013-06-08T21:48:15.670 回答
0

问题在于写入不从字节码中检索图像,必须逐像素写入图像。
我对您将图像转换为字节数组和虎钳的捷径很感兴趣,但不幸的是第一个失败了。
也许我为您制作的这种方法会对您有所帮助:

  • 创建您自己的类名称,例如 ImageConversation 或任何名称。
  • 将所有对话(byte[] 到 image 或 Image 到 bye[])设为静态,以便您可以通过类名调用它们。

此方法将从 FileChooser 或给定文件转换为选定文件并将其转换为byte[],但它有点长,它不是最好的方法,但它给出了一个很好的结果,我没有问题它。

        public static byte [] imageToBytoArray(File file){

        ByteArrayOutputStream byteArray;
        try{
            FileInputStream fileStream = new FileInputStream(file);
            byteArray = new ByteArrayOutputStream();
            byte [] buffer = new byte [1024];
            for(int i ;(i=fileStream.read(buffer)) !=-1;){
                byteArray.write(buffer, 0, i);
            }
            return byteArray.toByteArray();

        }catch(Exception ex){
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
        return null;
    }
于 2013-06-08T21:55:08.807 回答