Toon posts:

[JAVA] image omzetten naar byte[]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met het volgende probleem:

Ik ben bezig een programma te maken dat images over kan sturen via JMS. Dit werkt allemaal prima, op het moment dat ik de image in een file inlees en dan die file in een byte[] zet.

Nu ben ik echter bezig met een webcam en wil die plaatjes oversturen via JMS. Aangezien ik alleen een String of een byte[] kan oversturen, moet het omgezet worden naar 1 van die 2 types. Een byte[] lijkt me de beste oplossing in dit geval.
Die image staat dus nu in een variabele en niet op de HDD.
Ik vind het een beetje omslachtig om hem op te slaan en dan weer in te lezen, om hem vervolgens om te zetten. Dit moet vast makkelijker kunnen.

Ik ben echt een hele tijd bezig geweest met het zoeken naar iets waar ik een image kan omzetten naar een byte[], maar ik heb nog niet kunnen vinden.

Nu is mn hoop helemaal op de mensen van GOT gevestigd, misschien dat iemand me hier verder kan helpen?

Alvast bedankt voor de reacties.

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

Ik heb heel even zitten speuren in de API, maar misschien kun je iets met Image.getRaster().getDataBuffer?

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Ik krijg dat een databuffer terug als ik die functie doe.

kan ik die databuffer dan weer omzetten naar een byte[]?
Kan het namelijk niet vinden in de API

//Sorry voor de (misschien domme) vraag, maar ben geen JAVA man... MOET het alleen in JAVA doen voor mn afstuderen :(

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

Als die DataBuffer van het type DataBufferByte is (instanceof DataBufferByte) kun je hem casten naar een DataBufferByte en een getData() doen. Die returnt een byte[].

Maar die info is allemaal in de API terug te vinden, en ik heb helaas geen tijd om een testprogrammaatje te schrijven. Toch hoop ik, dat ik je een beetje op weg geholpen heb.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Ik snap waar je naartoe wilt...

Ik denk dat dit wel een goede oplossing is voor mijn probleem, maar 1 ding lukt nog niet...

ik heb nu dit:

Java:
1
2
3
4
5
6
7
    DataBufferByte  buf=null;
    DataBuffer      db =null;
    byte[]          ba = null;

    db = image.getRaster().getDataBuffer();
    ba = new byte[buf.getSize()];
    ba = buf.getData();


Ik kan dus wel de data in een Databuffer zetten en als ik het in een DataBufferByte kan zetten ook uitlezen en in een array zetten. het probleem is dus dat ik niet weet hoe ik het programma zo ver krijg om die DataBuffer van het type DataBufferByte te maken.

Tussen db = image.getRaster().getDataBuffer(); en ba = new byte[buf.getSize()]; moet nog iets komen om buf gelijk te maken aan de inhoud van db lijkt me... Maar wat? :S

Als ik dat weet, dan ben ik eruit denk ik.

[ Voor 12% gewijzigd door Verwijderd op 29-11-2004 13:50 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

code:
1
2
3
if (db instanceof DataBufferByte) {
buf = (DataBufferByte) db;
}

[ Voor 41% gewijzigd door Nick_S op 29-11-2004 13:58 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Zoiets had ik ook al geprobeerd, maar db is niet een instanceof DataBufferByte, maar heeft als type int.

Als ik dan db probeer te casten, dan krijg ik een classcastexception.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:11

Robtimus

me Robtimus no like you

Verwijderd schreef op maandag 29 november 2004 @ 13:44:
Java:
1
2
    ba = new byte[buf.getSize()];
    ba = buf.getData();
Die eerste statement mag weg. Wat je hier doet nml: je alloceert een nieuw byte array en laat ba daarnaartoe referencen (enige reference). Vervolgens verwiider je die reference door ba naar het resultaat van buf.getData() te laten referencen. Gevolg: dat ene array kan direct alweer worden ge-garbage-collect.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:11

Robtimus

me Robtimus no like you

Verwijderd schreef op maandag 29 november 2004 @ 14:03:
Zoiets had ik ook al geprobeerd, maar db is niet een instanceof DataBufferByte, maar heeft als type int.

Als ik dan db probeer te casten, dan krijg ik een classcastexception.
Dan kast je hem naar DataBufferInt en wordt je ba een int[], werkt het ook. Vervolgens is het ff zaak dat int[] te converteren in byte[], wat geen probleem is als alle waarden ervan tussen -128 en 127 liggen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

db van type int?

code:
1
DataBuffer         db =null;


Hier zeg je toch echt, dat db in ieder geval van type DataBuffer is.

Probeer eens:
code:
1
System.out.println(db.getClass());


Misschien dat je dan wijzer wordt van welke subclass van DataBuffer het is.

[edit]
een beetje te traag gereageerd. Probeer inderdad maar wat IcemanX zegt.

[ Voor 13% gewijzigd door Nick_S op 29-11-2004 14:08 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
class java.awt.image.DataBufferInt

Dat komt eruit als ik die system.out.println() doe...

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

IceManX schreef op maandag 29 november 2004 @ 14:06:
[...]
Dan kast je hem naar DataBufferInt en wordt je ba een int[], werkt het ook. Vervolgens is het ff zaak dat int[] te converteren in byte[], wat geen probleem is als alle waarden ervan tussen -128 en 127 liggen.
Probeer het dan zoals IcemanX al aangaf.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
[n00b mode]

Hoe ga ik dat dan doen, dat omzetten? Casten lukt niet...

Nu weet ik weer waarom ik geen JAVA fan ben :S
Vind het echt niet fijn werken...

[/n00b mode]

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 04-04 16:23

Macros

I'm watching...

Dit stukje code zou voor alle objecten moeten werken, niet alleen Image objecten:
Java:
1
2
3
4
5
6
  static private byte[] object2Bytes( Object o ) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream( baos );
    oos.writeObject( o );
    return baos.toByteArray();
  }

Ik zou je de omgekeerde versie natuurlijk zelf uit kunnen laten zoeken, maar je hebt toch al een hekel aan Java, dus ik geef je het wel kado, ook al vroeg je er niet om.
Java:
1
2
3
4
5
6
7
  static private Object bytes2Object( byte raw[] )
      throws IOException, ClassNotFoundException {
    ByteArrayInputStream bais = new ByteArrayInputStream( raw );
    ObjectInputStream ois = new ObjectInputStream( bais );
    Object o = ois.readObject();
    return o;
  }

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Topicstarter
Het mooie is dat Image niet serializable is.

Daardoor gaat deze mooie functie onderuit :(

En (Object) image doen werkt ook niet...

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 04-04 16:23

Macros

I'm watching...

Verwijderd schreef op maandag 29 november 2004 @ 15:45:
Het mooie is dat Image niet serializable is.

Daardoor gaat deze mooie functie onderuit :(

En (Object) image doen werkt ook niet...
Je redding:
http://java.sun.com/j2se/...avax/swing/ImageIcon.html

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Topicstarter
ImageIcon was wel een goed plan ja...

Kan nu in ieder geval jou stukje code gebruiken...

Het enige is nu nog, dat het byte[] niet klopt...
Als ik namelijk mn byte[] wegschrijf, dan komt er niet een plaatje uit, maar een bestand wat niet te herkennen is als plaatje... Ookal save ik hem als plaatje ;)

Het bestand is ook 300K groot, voor een plaatje van 320x240!?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 04-04 16:23

Macros

I'm watching...

Nee, dat klopt, als je het plaatje wilt opslaan kan je het beste ImageIO gebruiken, die kan het opslaan in een aantal leuke formaten. Je kan dat resultaat meteen inlezen zonder het in een file te zetten door de write methode te gebruiken. Die OutputStream kan je dan omzetten in een ByteOutputStream.

[ Voor 22% gewijzigd door Macros op 29-11-2004 16:18 ]

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Topicstarter
Bij deze wil ik iedereen graag bedanken voor de medewerking...

Ik ben weer verder gekomen met mn proggie, dus das mooi :)

TNX

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 04-04 16:23

Macros

I'm watching...

Verwijderd schreef op dinsdag 30 november 2004 @ 13:00:
Bij deze wil ik iedereen graag bedanken voor de medewerking...

Ik ben weer verder gekomen met mn proggie, dus das mooi :)

TNX
Misschien kan je je preciese oplossing nog posten voor het 'nageslacht' :)

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Topicstarter
Kan ik wel doen, maar dan post ik jouw code ;)

Ik kan gewoon die code gebruiken en gebruikmaken van een imageicon...
Aangezien deze wel serializable is...

Als er echt behoefte is om nog een keer je code te posten, dan wil ik dat wel doen ;)

Een imageicon omzetten in code gaat dan als volgt bij mij:

Java:
1
2
3
    ii = new ImageIcon();
    ii.setImage(image);
    ba = object2Bytes((Object)ii);

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 04-04 16:23

Macros

I'm watching...

Java:
1
2
3
4
5
static private byte[] image2Bytes( BufferedImage image ) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(image, "PNG", baos);
    return baos.toByteArray(); 
}

Ik denk dat deze code veel vriendelijker zal zijn voor je bandbreedte.

"Beauty is the ultimate defence against complexity." David Gelernter

Pagina: 1