如何将BufferedImage转换为int []?

时间:2016-06-14 04:27:53

标签: java arrays sockets int bufferedimage

我希望通过套接字发送一个具有BufferedImage的Object。 BufferedImage不可序列化,因此需要将其转换为可序列化的数据类型,然后再转换回来。我在网上看了很多,而且byte []似乎只是发送一个BuffereImage,但我试图发送一个完整的对象,所以我更倾向于int []。几个星期前,我以为我在这里遇到了解释这个问题的答案,但经过2.5小时的搜索后我找不到了。我尝试过Java Oracle,但很快就迷路了。

如果有更好的方法请原谅我的无知,因为我没有真正使用套接字和BufferedImage操作。

2 个答案:

答案 0 :(得分:1)

基本上BufferedImage是一个数组。像素存储在DataBuffer中,这是一个数组。

BufferedImage source = //...
switch ( source.getType() )
    {
    case BufferedImage.TYPE_BYTE_GRAY :
    case BufferedImage.TYPE_3BYTE_BGR :
    case BufferedImage.TYPE_4BYTE_ABGR :
        final byte[] bb = ((DataBufferByte)source.getRaster().getDataBuffer()).getData() ;
        //...
        break ;
    case BufferedImage.TYPE_USHORT_GRAY :
        final short[] sb = ((DataBufferUShort)source.getRaster().getDataBuffer()).getData() ;
        //...
        break ;
    case BufferedImage.TYPE_INT_RGB :
    case BufferedImage.TYPE_INT_BGR :
    case BufferedImage.TYPE_INT_ARGB :
        final int[] ib = ((DataBufferInt)source.getRaster().getDataBuffer()).getData() ;
        break ;
    // etc.
    }

您还需要发送图像尺寸以及通道数。

答案 1 :(得分:1)

将图像作为PNG发送:

// BufferedImage -> byte sequence
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "PNG", baos);
byte[] imageData = baos.toByteArray();
// byte sequence -> BufferedImage
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
BufferedImage img = ImageIO.read(bais);