Avatar billede stephanryer Nybegynder
02. november 2005 - 22:48 Der er 11 kommentarer og
1 løsning

Convert: Billede > Byte array OG byte array > billede

Jeg sidder og leger med noget UDP og vil gerne prøve at sende et billede.

Hvis vi nu fx siger jeg har et Image / BufferedImage (Underordnet) hvordan laver jeg så dette om til et byte array? Og når jeg modtager det vil jeg gerne lave dette byte array om til et billede igen.

Nogen skarpe hjerne derude?

På forhånd tak.
Avatar billede arne_v Ekspert
02. november 2005 - 22:51 #1
ImageIO.write kan skrive tiul en ByteArrayOutputStream
Avatar billede arne_v Ekspert
02. november 2005 - 22:52 #2
og ImageIO.read kan læse fra en ByteArrayInputStream
Avatar billede mikkelbm Nybegynder
02. november 2005 - 22:52 #3
Jeg har følgende metoder liggende:

public static byte[] encodeImage(BufferedImage img, String format, float quality)
{
  try
  {
    // Billedet bliver skrevet i byte[] format til denne stream
    ByteArrayOutputStream output = new ByteArrayOutputStream();

    ImageOutputStream imgOut = javax.imageio.ImageIO.createImageOutputStream(
        output);

    // Find den rigtige image-encoder, fx. en jpeg-encoder
    ImageWriter writer = null;
    Iterator writers = ImageIO.getImageWritersByFormatName(format);

    if (writers.hasNext())
      writer = (ImageWriter) writers.next();
    else
      return null;

    // Fortæl encoderen hvortil den skal skrive
    writer.setOutput(imgOut);

    // Sæt komprimeringskvaliteten
    ImageWriteParam param = writer.getDefaultWriteParam();
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(quality);

    // Skriv billedet til den underliggende stream
    writer.write(null, new IIOImage(img, null, null), param);
    imgOut.flush();
    writer.dispose();
    imgOut.close();

    // Et byte[] array repræsentation af et image
    byte[] encoded = output.toByteArray();
    return encoded;
  }
  catch (Exception e)
  {
    e.printStackTrace();
    return null;
  }
}


public static BufferedImage decodeImage(byte[] imageData, String format)
{
  try
  {
    // Stream der skal skrives fra
    ByteArrayInputStream input = new ByteArrayInputStream(imageData);

    ImageInputStream imgIn = ImageIO.createImageInputStream(input);
    Iterator readers = ImageIO.getImageReadersByFormatName(format);

    // Find en image-decoder der matcher format
    ImageReader reader = null;
    if (readers.hasNext())
      reader = (ImageReader) readers.next();
    else
      return null;

    // Læs fra byte streamen og omdan til et bufferedimage
    reader.setInput(imgIn);
    BufferedImage newImg = reader.read(0);

    imgIn.flush();
    reader.dispose();
    imgIn.close();

    // Et bufferedimage som er blevet omdannet fra et byte array..!
    return newImg;
  }
  catch (Exception e)
  {
    e.printStackTrace();
    return null;
  }
}
Avatar billede mikkelbm Nybegynder
02. november 2005 - 22:52 #4
Jeg skal ikke kunne sige om det kan gøres mere elegant. Men det virker.
Avatar billede stephanryer Nybegynder
02. november 2005 - 22:55 #5
jeg prøver det lige. kvaliteten varierer fra hvad til hvad? 0.0 til 1.0 ?
Avatar billede mikkelbm Nybegynder
02. november 2005 - 22:55 #6
Jeps
Avatar billede stephanryer Nybegynder
02. november 2005 - 22:55 #7
optimalt, tester det lige :D Tak for de hurtige svar.
Avatar billede stephanryer Nybegynder
02. november 2005 - 23:13 #8
Jeg har oprettet et Image og tegnet det på et BufferedImage. Dette har jeg testet og det vises korrekt. Når jeg sender det er der ingen problemer, men når jeg modtager det får jeg denne fejl:

javax.imageio.IIOException: Invalid JPEG file structure: missing SOS marker
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)Recieved image

    at javax.imageio.ImageReader.read(Unknown Source)
    at main.ImageConverter.decodeImage(ImageConverter.java:75)
    at main.RecieveHandler.run(RecieveHandler.java:27)

Den øverste reference i fejlmeddelelsen fører hen til linien:

            BufferedImage newImg = reader.read(0);

i decodeImage();
Avatar billede stephanryer Nybegynder
02. november 2005 - 23:15 #9
Hov vent. Det var fordi jeg ikke havde sat størrelsen på min DatagramPacket stor nok til at kunne rumme billedet. Det virker nu. Takker Mikkel. Læg et svar.

Arne jeg beklager at Mikkel fik pointene men hans bidrag var mere konkret og til at tage at føle på. No hard feelings.
Avatar billede arne_v Ekspert
02. november 2005 - 23:15 #10
er du sikker på at du har modtaget det hele når de decoder ?
Avatar billede stephanryer Nybegynder
02. november 2005 - 23:16 #11
nej det var lige præcis det der var problemet :D
Avatar billede mikkelbm Nybegynder
02. november 2005 - 23:16 #12
Kommer her...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester