# Schlechte Qualität beim skalieren von Bildern



## michael bauer (14. Feb 2008)

hallo,
mit folgender routine will ich thumbs erstellen, es geht, ist recht schnell und die dateigröße ist schön klein, leider ist aber auch die qualität recht schlecht.

```
BufferedImage img = ImageIO.read(file);
					float breite = img.getWidth(this);
					float hoehe = img.getHeight(this);
					if (breite>=hoehe) {
						scalX = (float)size/breite;
						scalY = scalX;
					}
					else {
						scalY = (float)size/hoehe;
						scalX = scalY;
					}
AffineTransform transform = AffineTransform.getScaleInstance(scalX, scalY);
AffineTransformOp op = new AffineTransformOp(transform,null);
BufferedImage scaledImage = op.filter(img, null);
ImageIO.write(img, "jpeg", new File(th.toString()+"/"+file.getName()));
```

wer kann mir helfen
vielen dank
Micha


----------



## Marco13 (14. Feb 2008)

Ist die Qualität von scaledImage schlecht, oder die von der JPG-Datei? Letzteres könnte auch mit der JPG-Kompression zusammenhängen. Für ersteres schau mal hier
http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
für letzteres vielleicht die Kompression der JPG-Writers verändern
http://java.sun.com/j2se/1.5.0/docs/api/javax/imageio/ImageWriter.html
http://java.sun.com/j2se/1.5.0/docs/api/javax/imageio/ImageWriteParam.html#setCompressionQuality(float)


----------



## michael bauer (14. Feb 2008)

hi,
danke für die links, konnt allerdings noch nichts gutes rauslesen, entweder die thumbs sind klein (ca. 4 kb) und qualitativ mieß, oder sie sind von den ausmaßen her nicht so wie ich es will, dubios...


----------



## Marco13 (14. Feb 2008)

Tja.
Kleine Dateien <-> geringe Qualität
Große Dateien <-> hohe Qualität
Keine Frage <-> Keine Antwort


----------



## André Uhres (14. Feb 2008)

michael bauer hat gesagt.:
			
		

> ..danke für die links, konnt allerdings noch nichts gutes rauslesen..


Hast du die richtigen RenderingHints eingesetzt (siehe erster Link)?


----------



## michael bauer (16. Feb 2008)

hi,
ich schaffe es nicht das bild dann auch zu speichern.

```
BufferedImage img = ImageIO.read(file);
					float breite = img.getWidth(this);
					float hoehe = img.getHeight(this);
					if (breite>=hoehe) {
						scalX = (float)size/breite;
						scalY = scalX;
					}
					else {
						scalY = (float)size/hoehe;
						scalX = scalY;
					}
					
					System.out.println("ScalX: "+scalX+ "ScalY: "+scalY);
					
					AffineTransform transform = AffineTransform.getScaleInstance(scalX, scalY);
					AffineTransformOp op = new AffineTransformOp(transform,null);
					BufferedImage scaledImage = op.filter(img, null);
				ImageIO.write(scaledImage, "jpeg", new File(th.toString()+"/"+file.getName()));
```
mit diesem code will ich die größen auslesen, dann mit scalX und scalY faktoren berechnen, dass das thumb-bild genau max. 90 pixel ist und in der letzten zeile will ich es in meinen neu erstellten thumb-ordner speichern.
kannst du mir bitte die zeilen reincoden, zb mit dem "SCALE_SMOOTH" oder was du denkst, damit das ganze geht, bei den links malen die das bild nur, speichern aber nicht,
wäre dir echt dankbar, ich bekomms nicht hin
mercy
Micha


----------



## André Uhres (16. Feb 2008)

Ich hatte da schon ein Beispiel gemacht. Vielleicht hilft das: IconDemo2.jar (Quellcode im jar)


----------



## michael bauer (19. Feb 2008)

hallo,
danke ich bin ein bischen weitergekommen, die thumbs sind ok.
noch ne kleine frage, ich lass meine original bilder in originalgröße anzeigen. nur sind sie zu groß, d.h größer zb 1000 px breite, als zb meine diggicam bilder, lass ich sie skalieren und dann anzeigen.
dieser vorgang ist sehr langsam, ca 2 sek pro bild, wie kann ich das beschleunigen, als wie zb, bei der vorschau von einem tool wie "irfanView" oder sowas.
danke
Micha


----------



## Marco13 (19. Feb 2008)

Nicht "per Hand" skalieren, sondern das (orignal-große) Bild mit
g.drawImage(image, 0, 0, wunschBreite, wunschHöhe, this);
zeichnen.


----------



## michael bauer (20. Feb 2008)

hallo,
danke, es geht etwas schneller mit deiner idee, trotzdem dauert es bei bildern von der diggicam sehr lange, vielleicht liegts auch am berechnen, ich muss das bild in bufferedImage legen, breite, höhe auslesen, scalierungsfaktor berechnen und neue maße, dann zeichne ich es mit deinem befehl, vielleicht dauert es einfach solange und andere tolls wie das irfanview sind vielleicht in C???
immerhin hab ich keinen heepspace error mehr, allerdings sind im ordner auch noch "nur" 12 bilder, befürchte der kommt wieder 
mercy
Micha


----------



## woz (1. Apr 2008)

Hi,
hab ich in 'nem englischsprachigen Forum mal gelesen (finde die Stelle nicht mehr):
Aber wenn Du nur verkleinerst, ist es sinnvoll, vom BufferedImage einfach getScaledInstance aufzurufen.
Liefert ein Image, das du nur noch in BufferedImage umwandeln musst.

Beispiel:

```
toBufferedImage(sourceImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING), BufferedImage.TYPE_INT_RGB);
```
wobei:

```
private static BufferedImage toBufferedImage(Image image, int type) {

    int w = image.getWidth(null);
    int h = image.getHeight(null);
    BufferedImage result = new BufferedImage(w, h, type);
    Graphics2D g = result.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return result;
  }
```

Schaut bei mir auch besser aus!!!

Könnte das weiterhelfen?


----------

