Java 如何将BuffereImage转换为int[]?

Java 如何将BuffereImage转换为int[]?,java,arrays,sockets,int,bufferedimage,Java,Arrays,Sockets,Int,Bufferedimage,我希望通过套接字发送一个具有BuffereImage的对象。BuffereImage不可序列化,因此需要将其转换为可序列化的数据类型,然后再转换回来。我在网上看了很多,byte[]似乎只是发送一个BuffereImage,但我试图发送一个完整的对象,所以我更倾向于int[]。几周前,我想我在这里找到了一个解释这一点的答案,但经过2.5个小时的搜索,我找不到它。我试过Java Oracle,但很快就迷路了 如果有更好的方法,请原谅我的无知,因为我在套接字和BuffereImage操作方面没有做太多

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


如果有更好的方法,请原谅我的无知,因为我在套接字和BuffereImage操作方面没有做太多工作。

基本上,BuffereImage是一个数组。像素存储在DataBuffer中,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.
    }

您还需要发送图像尺寸,加上通道数。

将图像作为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);

为什么不使用
byte[]
,因为我看到它使用的大多数实例只是通过套接字发送一个抖动图像,而不是整个对象。。。除非我完全错误地将ImageIO用于此,除非您非常非常确定要通过导线发送原始图像光栅数据。(根据您的问题=)您可以使用ImageIO类将BuffereImage转换为PNG图像(无损,支持透明,具有一些无损压缩)。您应该能够用一两行代码来完成这项工作。它还将保存图像尺寸等,这是原始阵列所不能做到的。这就是PNG等图像格式的用途(图像的存储和传输)。您可以使用ImageIO将BuffereImage转换为通过套接字发送的二进制数据(PNG或其他格式)。然后,在另一方面,您使用ImageIO将其转换回BuffereImage。注释中已经提到了必须通过网络传输的大型阵列(并且不知道图像本身的大小)的缺点(与PNG压缩数据相比)。此外,像这样获取数据缓冲区数据会导致图像变得“不可跟踪”(有时称为“非托管”),并会显著降低该图像的绘制性能。除此之外,这是对这个问题的合理回答,无论提问者打算采用的方法是否是最佳方法……是的,我回答的是基本问题“将图像转换为int[]”。是的,发送压缩数据会快得多。