如何将BufferedImage转换为int[]?

3
我想通过套接字发送一个包含BufferedImage的对象。BufferedImage不可序列化,因此需要将其转换为可序列化的数据类型,然后再转换回来。我在网上找了很多资料,似乎使用byte[]是发送BuffereImage的最佳选择,但是我要发送整个对象,所以更倾向于使用int[]。几周前我在这里看到了一个解释,但是经过2.5小时的搜索,我找不到它了。我尝试了Java Oracle,但很快就迷失了方向。
如果有更好的方法,请原谅我的无知,因为我没有真正使用过套接字和BufferedImage操作。

因为我看到它被使用的大多数情况是通过套接字发送缓冲图像,而不是整个对象... 除非我完全错了。 - Dak31
3
除非你非常确定要通过网络发送原始图像数据,否则请使用ImageIO进行操作(根据你的问题,你不需要这么做 =) https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html - BadZen
4
你可以使用ImageIO类将BufferedImage转换为PNG图像(无损,支持透明度,并具有一些无损压缩)。你应该只需要一两行代码就能实现这个过程。相比于原始数组,它还能保存图像的尺寸等信息。这也是像PNG这样的图像格式存在的意义(存储和传输图像)。 - slipperyseal
我想当BadZen回复时,我正在写我的回复 :) - slipperyseal
3
您可以使用ImageIO将BufferedImage转换为二进制数据,并通过套接字发送(例如PNG)。然后,在另一端,您可以使用ImageIO将其转换回BufferedImage。 - slipperyseal
显示剩余4条评论
2个回答

4

基本上,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.
    }

您还需要发送图像的尺寸和通道数。

在评论中已经提到了具有大数组(并且不知道图像本身大小)必须通过网络传输(与PNG压缩数据相比)的缺点。此外,像这样获取数据缓冲区数据会导致图像变得“无法跟踪”(有时称为“未管理”),并且可能会显着降低该图像的绘制性能。除此之外,无论询问者打算采用的方法是否最佳,这都是对问题的合理回答... - Marco13
是的,我正在回答基本问题“将图像转换为int []”。而且,发送压缩数据会更快。 - FiReTiTi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接