2016-06-14 19 views
2

Ich bin auf der Suche nach einem Objekt, das ein BufferedImage über einen Socket hat. BufferedImage ist nicht serialisierbar, daher muss es in einen serialisierbaren Datentyp konvertiert werden und dann wieder zurück. Ich habe viel online geschaut, und byte [] scheint es zu sein, nur ein BuffereImage zu senden, aber ich versuche, ein ganzes Objekt zu senden, so dass ich mich mehr nach int [] sehne. Ich dachte, ich wäre vor ein paar Wochen auf eine Antwort gestoßen, die das hier erklärt, aber nach 2,5 Stunden Suche konnte ich es nicht finden. Ich habe das Java-Oracle ausprobiert, bin aber schnell verloren gegangen.Wie konvertiert man BufferedImage zu einem int []?

Wenn es einen besseren Weg gibt bitte entschuldigen Sie meine Ignoranz, da ich nicht wirklich viel mit Sockets und BufferedImage Manipulation gearbeitet habe.

+0

warum sind Sie nicht nur ein buffeted Bild, nicht das gesamte Objekt mit 'byte []' – Ramanlfc

+0

Da die meisten der Fälle, ich sehe es verwendet wird, sendet , durch eine Steckdose ... Es sei denn, ich bin völlig falsch – Dak31

+0

Wenn Sie sagen "gesamtes Objekt", welche zusätzlichen Felder meinen Sie? Offensichtlich gibt es das Bild selbst (ein Array von Bytes), aber meinst du Breite und Höhe usw.? Palette? Das Problem tritt auf, wenn Sie versuchen, einen Multi-Byte-Wert zwischen verschiedenen Plattformen zu verwenden: das Senden von 'int's über Netzwerke ist unordentlich ... –

Antwort

1

das Bild senden across als 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); 
1

Grundsätzlich ist ein BufferedImage ein Array. Die Pixel werden im DataBuffer gespeichert, der ein Array ist.

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. 
    } 

Sie müssen auch die Bildabmessungen und die Anzahl der Kanäle senden.

+0

schauen Der Nachteil, ein großes Array zu haben (und * nicht * die Größe des Bildes selbst zu wissen), die über das Netzwerk (im Vergleich zu komprimierten PNG-Daten) übertragen werden muss, wurde bereits in den Kommentaren erwähnt. Darüber hinaus verursacht das Erhalten der Datenpufferdaten auf diese Weise, dass das Bild "nicht-verfolgbar" wird (manchmal als "nicht verwaltet" bezeichnet) und kann die Anstrichleistung für dieses Bild erheblich reduzieren. Abgesehen davon ist dies eine vernünftige Antwort auf die Frage, unabhängig davon, ob der Ansatz, der vom Fragesteller beabsichtigt wurde, der beste ist oder nicht ... – Marco13

+0

Ja, ich beantwortete die grundlegende Frage "Konvertiere ein Bild in int [] ". Und ja, senden komprimierte Daten wäre viel schneller. – FiReTiTi