简体   繁体   English

Kryonet,无法发送BufferedImage

[英]Kryonet, can't send BufferedImage

I'm still learning Java and I have searched into the Javadoc of Kryonet and didn't find any answers to my problem. 我仍在学习Java,并且搜索了Kryonet的Javadoc,但没有找到解决我的问题的答案。

I am adding a webcam function to a simple chat program. 我正在将网络摄像头功能添加到一个简单的聊天程序中。

I am currently trying to transfer a single frame taken by my webcam to another computer. 我目前正在尝试将网络摄像头拍摄的一幅图像传输到另一台计算机。

Kryonet allows me to send "homemade" packets, so made this packet : Kryonet允许我发送“自制”数据包,因此使此数据包:

Packet9WebcamFrame.java Packet9WebcamFrame.java

import java.awt.image.BufferedImage;

public class Packet9WebcamFrame{
    public BufferedImage frame;
}

In my client I then had to register this packet : 然后在我的客户端中,我必须注册此数据包:

client.getKryo().register(Packet9WebcamFrame.class);

But then i had errors that made me register other classes : 但是后来我遇到了让我注册其他课程的错误:

client.getKryo().register(java.awt.image.BufferedImage.class);
client.getKryo().register(java.awt.image.ComponentColorModel.class);
client.getKryo().register(java.awt.color.ICC_ColorSpace.class);
client.getKryo().register(float[].class);
client.getKryo().register(java.awt.color.ICC_ProfileRGB.class);
client.getKryo().register(short[].class);
client.getKryo().register(byte[].class);
client.getKryo().register(int[].class);
client.getKryo().register(sun.awt.image.SunWritableRaster.class);
client.getKryo().register(java.awt.image.DataBufferByte.class);
client.getKryo().register(byte[][].class);

So, now, when my client receive the packet saying "Hello I need you to send me a webcam frame please", it does that : 因此,现在,当我的客户收到“您好,请您向我发送网络摄像头框架”的数据包时,它将执行以下操作:

webcam.open();

    if (webcam.isOpen())
    {

        Packet9WebcamFrame wFrame = new Packet9WebcamFrame();

        wFrame.frame = webcam.getImage();

        //We send the frame via the packet
        try
        {
            Main.client.sendTCP(wFrame);
        }

        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("I have sent a webcam frame");

        webcam.close();

    }       

After that i hoped it would work, but still an error : 在那之后,我希望它会起作用,但仍然是一个错误:

com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException Serialization trace: bankdata (java.awt.image.DataBufferByte) dataBuffer (sun.awt.image.SunWritableRaster) raster (java.awt.image.BufferedImage) com.esotericsoftware.kryo.KryoException:java.nio.BufferOverflowException序列化跟踪:bankdata(java.awt.image.DataBufferByte)dataBuffer(sun.awt.image.SunWritableRaster)栅格(java.awt.image.BufferedImage)

frame (com.jmr.monitor.packets.Packet9WebcamFrame) 框架(com.jmr.monitor.packets.Packet9WebcamFrame)

at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kry 在com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:585)在com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)在com.esotericsoftware.kryo.serializers.FieldSerializer。 (com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:564)处的com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)中的(Kryo.java:504)。 com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:564)上的esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)在com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer。 com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)处com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:564)处com.esotericsoftware.kryo.serializers .FieldSerializer.write(FieldSerializer.java:213)在com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kry o.java:571) at com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50) at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) at com.jmr.monitor.PacketHandler.handlePacket4(PacketHandler.java:131) at com.jmr.monitor.Main$1.received(Main.java:93) o.java:571)位于com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)位于com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)com.esotericsoftware.kryonet.Connection.sendTCP (com.jmr.monitor.PacketHandler.handlePacket4(Connection.java:59)在com.jmr.monitor.Main $ 1.received(Main.java:93)

So, it's a bufferOverflow issue, i've tried a few things in my client's constructor such as increasing the buffer size but no luck so far. 因此,这是一个bufferOverflow问题,我在客户端的构造函数中尝试了一些操作,例如增加缓冲区大小,但到目前为止还没有运气。

Any idea on how to fix this annoying issue ? 关于如何解决这个烦人的问题有任何想法吗?

Thank you in advance. 先感谢您。

Regards, 问候,

Azsde. Azsde。

A package has a fixed size (I guess). 一个包装有固定的尺寸(我想)。 I stuck with a similar problem. 我遇到了类似的问题。 It boils down that BufferedImage does not have a non-argument constructor and if one uses different methods to get around this problem like using no constructor at all when deserializing, it goes south. 它可以归结为BufferedImage没有无参数构造函数,并且如果人们使用不同的方法来解决此问题,例如在反序列化时根本不使用构造函数,则它会向南移动。

So basically what you want is serialize a buffered image. 因此,基本上,您想要的是序列化缓冲图像。 One thing you can do is provide your own serializer (it can be read on their github page) or extract an RGB version or store the byte / int content of the image or even write a PNG to memory and send the PNG/JPG instead (gives you compression). 您可以做的一件事是提供自己的序列化程序(可以在其github页面上读取)或提取RGB版本或存储图像的字节/整数内容,甚至将PNG写入内存并发送PNG / JPG(给您压缩)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM