Kryonet, не могу отправить BufferedImage

Я все еще изучаю Java, и я искал в Javadoc Kryonet и не нашел ответов на свою проблему.

Я добавляю функцию веб-камеры в простую программу чата.

В настоящее время я пытаюсь передать один кадр, снятый моей веб-камерой, на другой компьютер.

Kryonet позволяет мне отправлять «самодельные» пакеты, поэтому сделал этот пакет:

Packet9WebcamFrame.java

import java.awt.image.BufferedImage;

public class Packet9WebcamFrame{
    public BufferedImage frame;
}

В моем клиенте мне пришлось зарегистрировать этот пакет:

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

Но потом у меня были ошибки, которые заставили меня зарегистрировать другие классы:

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

Итак, теперь, когда мой клиент получает пакет с надписью «Привет, мне нужно, чтобы вы отправили мне кадр веб-камеры, пожалуйста», он делает следующее:

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

    }       

После этого я надеялся, что это сработает, но все равно ошибка:

com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException Трассировка сериализации: банковские данные (java.awt.image.DataBufferByte) dataBuffer (sun.awt.image.SunWritableRaster) растр (java.awt.image.BufferedImage)

кадр (com.jmr.monitor.packets.Packet9WebcamFrame)

на com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585) на com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) на 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.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.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(Kryo.java:571) на com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50) на com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) ) в com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) в com.jmr.monitor.PacketHandler.handlePacket4(PacketHandler.java:131) в com.jmr.monitor.Main$1.received(Main.java :93)

Итак, это проблема bufferOverflow, я попробовал несколько вещей в конструкторе моего клиента, например, увеличить размер буфера, но пока безуспешно.

Любая идея о том, как исправить эту досадную проблему?

Заранее спасибо.

С уважением,

Азде.


person Azsde    schedule 05.10.2014    source источник


Ответы (1)


Пакет имеет фиксированный размер (я думаю). Я застрял с похожей проблемой. Это сводится к тому, что BufferedImage не имеет конструктора без аргументов, и если кто-то использует другие методы для решения этой проблемы, например, вообще не используя конструктор при десериализации, он идет на юг.

Итак, в основном вы хотите сериализовать буферизованное изображение. Одна вещь, которую вы можете сделать, это предоставить свой собственный сериализатор (его можно прочитать на их странице github), или извлечь версию RGB, или сохранить содержимое byte/int изображения, или даже записать PNG в память и вместо этого отправить PNG/JPG ( дает вам компрессию).

person Martin Kersten    schedule 17.11.2015