Sensei: JPEG Encoder: Farben werden falsch

Hi!

Ich habe für ein Projekt einen ganz einfachen JPEG Encoder verwendet.
Dabei gehts darum:

  • Zuerst wird ein JPEG Bild eingelesen
  • Dann wird es verändert
  • Dann wird es als original und das veränderte dargestellt
    (klappt alles bis hier hin)
  • und dann wollte ich noch das veränderte Bild (bufferedImage)abspeichern, mit folgendem code:

----------------------------------------

ByteArrayOutputStream out = new ByteArrayOutputStream(0xfff);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

JPEGEncodeParam param;
       param = encoder.getDefaultJPEGEncodeParam(painting);

param.setQuality(0.75f, false);
       encoder.encode(painting/*, param*/);

FileOutputStream fos = new FileOutputStream(getBasePath()+"spider/painterly"+frameCounter+".jpg");
       fos.write(out.toByteArray());
       fos.close();
        out.close();

----------------------------------------

Nunja, das Bild wird leider nicht so wies sein sollte (so wies auch angezeigt wird). Die Fraben sind total komisch, viel rot und blau...!

Was mache ich da falsch? Muss ich irgendwelche Farbpaletten übergeben oder so?

Vielen Dank, Sensei

  1. Hi,

    Nunja, das Bild wird leider nicht so wies sein sollte (so wies auch angezeigt wird). Die Fraben sind total komisch, viel rot und blau...!

    Kann es sein, daß Du die Farbkanäle in der falschen Reihenfolge ausgibst (BGR statt RGB)?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Kann es sein, daß Du die Farbkanäle in der falschen Reihenfolge ausgibst (BGR statt RGB)?

      Naja... ich habe ja meinen ganzen Code hingeschrieben. Da is ja nix mit Farbkanälen.
      Kann man das irgfendwie speziell angeben?

      Danke

  2. Hallo,

    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
           JPEGEncodeParam param;

    JPEGImageEncoder, JPEGCodec und JPEGEncodeParam sind alle aus dem
    Package "com.sun.image.codec.jpeg".

    Merke: Verwende niemals (nie, nie, nie) Klassen aus den Packages
    "com.sun.*". Verwende nur Klassen aus den Packages "java.*".
    Die Klassen unterhalb von "com.sun.*" sind nur für den internen
    Gebrauch des API bestimmt, und können sich jederzeit ändern oder
    entfernt werden. Außerdem wird nicht garantiert, daß sie das tun,
    was sie sollen.
    Solange du nicht sehr(!) genau weißt was du tust, und ganz sicher
    bist, daß du Klassen aus "com.sun.*" verwenden möchtest, solltest du
    sie auf gar keinen Fall verwenden!

    Im Java Almanac ist beschrieben, wie du ein JPG-Bild speicherst.
    Dort wird auch gezeigt wie die Qualität festgelegt, so wie du das
    ja offensichtlich tun willst.

    (Beachte, daß in der JDK1.4 ein Bug in der setCompressionQuality()-
    Methode vorhanden ist, der das Überschreiben der Methode notwendig
    macht, um die korrekte Funktionalität nachzubilden.)

    Falls du dasselbe Problem auch bei Vermeidung von "com.sun.*"
    weiterhin haben solltest, melde dich einfach nochmal. (Vergiß dann
    bitte nicht, deinen neuen Code zu posten.)

    Ich würde ja ohnehin auf einen Fehler beim Verändern des Bildes tippen.
    Bei mir war es zumindest bisher immer dieses Problem. :-)

    (Ich meine mich an ein Problem zu erinnern, daß das Speichern von
    JPG-Bildern nicht richtig funktioniert, wenn das Bild einen Alpha-
    Kanal hat. Solltest du versehentlich ein BufferedImage vom Typ
    RGBA erzeugen, solltest du mal ein reines RGB probieren.)

    Was mache ich da falsch? Muss ich irgendwelche Farbpaletten übergeben oder so?

    JPEG hat keine Farbpaletten.

    Gruß
    Slyh

    1. Hallo!

      Danke für die ausführliche Antwort - hat mir wirklich sehr geholfen. ICh habe das mit com.sun.* nicht gewusst...!

      der Fehler war tatsächlich das mit dem Alphakanal.
      statt
           super(width, height, TYPE_INT_ARGB);
      habe ich jetzt
           super(width, height, TYPE_INT_RGB);

      in meiner Bild-Klasse verwendet und alles klappt tadellos!

      Danke nochmal auch für den Hinweis mit com.sun,

      cu, Sensei