Qualität des JPEGImageEncoder

holtiwilan

Mitglied
Guten Morgen.
Folgendes: Ich habe ein kleines Proggi geschrieben, das mir Bilder für das Einstellen in ein Forum Optimieren soll.
z.B.: maximal 800 x 800 Pixel und 150 Kb Gross.
Das habe ich mit dem JPEGImageEncoder realisiert.
Nur bin ich mit der Qualitär der Umgewandelten Bilder nicht zufrieden.
Wenn ich ein Bild, das ich mit der unten stehenden Methode auf o.g. Parameter birgen ist die Qualität des Bildes merklich schlechter, als die mit dem Photoshop erstellten kleineres Version des Bildes.
Woran kann das liegen? Gibt es da eine bessere Möglichkeit?

Code:
public void doResize() {
    dQuality = 1.0;
    //Open Image
    this.ButtonStart.setEnabled(false);
    Image img = getToolkit().getImage(this.sQuelle);
    System.out.println("Loading Image: " + this.sQuelle);
    //Bild im Mediatracker laden
    loadImage(img);
    //Bildgrößen holen
    int iw = img.getWidth(this);
    int ih = img.getHeight(this);

    //Faktoren für die verkleinerung berechen
    float faktorw = (float)this.iWidth / iw;
    float faktorh = (float)this.iHeight / ih;
    float faktor = faktorw;
    //den kleineren Faktor für neue Bildgröße nehmen
    if (faktorw < faktorh)
      faktor = faktorw;
    if (faktorh < faktorw)
      faktor = faktorh;

    //Neue Bildgröße setzten  
    int w = (int) (iw * faktor);
    //neues Bild mit der Bildgröße erstellen
    Image i2 = img.getScaledInstance(w, -1, 0);
    //neues Bild im Mediatracker Laden
    loadImage(i2);

    //Neue Dimensionen des Bilden holen
    int i2w = i2.getWidth(this);
    int i2h = i2.getHeight(this);
    //Buffered Image erstellen
    BufferedImage bi = new BufferedImage(i2w, i2h, BufferedImage.TYPE_INT_RGB);
    Graphics2D big = bi.createGraphics();
    big.drawImage(i2, 0, 0, this);
    //ByteArray für Bildspeicherung
    ByteArrayOutputStream out = new ByteArrayOutputStream(0xfff);
    do {
      //Array löschen
      out.reset();
      //JPEGImageEncoder zum schreiben in des BufferedImage in das Array benutzen
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
      try {
        JPEGEncodeParam param;
        param = encoder.getDefaultJPEGEncodeParam(bi);
        //Komprimierung setzten
        param.setQuality( (float)this.dQuality, true);
        encoder.encode(bi, param);
        out.close();
      }
      catch (IOException ioe) {
        ioe.printStackTrace();
      }
      img.flush();
      bi.flush();
      //Größe des Bildes holen
      this.ImageSize = out.size();
      System.out.println("Grösse: " + this.ImageSize);
      //Komprimierungsfaktor erhöhen (Wert verkleinern)
      this.dQuality = this.dQuality - 0.01;
      System.out.println("Quality: " + this.dQuality);
    }
    //Zielgröße erreicht? Wenn nicht, dann nochmal
    while (ImageSize > this.iZielgroesse);
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(this.sZiel);
    }
    catch (FileNotFoundException ex) {
      ex.printStackTrace();
    }
    try {
      fos.write(out.toByteArray());
      fos.close();
      out.close();
    }
    catch (IOException ex1) {
      ex1.printStackTrace();
    }
    this.ButtonStart.setEnabled(true);

  }
 
Zurück