# skallieren von Bildern



## AmunRa (7. Sep 2008)

HAllo ich schreib gerade an einem Prog. mit dem ich alle Fotos in einem Ordner auf eine spezielle Größe skalliere 
Das programm funktioniert eigentlich fehlerfrei, aber ich hab folgendes Problem:

Wenn ich Fotos von  meiner Digi-cam sakallieren möchte dauert das bei manchen gerade 3 sek doch fotos die Größer als 3 MB sind brachen fast 3 min.

Die Fotos haben  aber die gleiche Auflösung:

Meine Fragen:

1. Warum haben manche Fotos bloß 2Mb und andere wieder über 3

2. Und wie kann ich verhindern,  dass das Skallieren bei den größeren Bildern(MB) so lange dauert?


----------



## L-ectron-X (7. Sep 2008)

Einige Bilder sind größer, weil in diesen Bildern mehr Information (Farben) gespeichert sind, die Kompression ist daher nicht so effektiv.


----------



## AmunRa (7. Sep 2008)

Danke für die antwort ich hab mir so etwas schon gedacht, aber wesshalb braucht ich bei den bildern mit 2 mb nur drei sekunden für das skallieren und bei denen mit 3mb  ca 180 sek (3 min) das bild ist ja blos 1 1/2 mal so groß und nicht 60 mal?


----------



## Illuvatar (7. Sep 2008)

Ja der Effekt komm mir sehr extrem vor, zeig doch vielleicht mal deinen Code mit dem du die Bilder skalierst?


----------



## AmunRa (7. Sep 2008)

Das ist der Code mit dem ich das Bild lade und skalliere anschliesen speichere ich das ganze wieder ab
mit der Methode System.currentTimeMillis() messe ich die Zeit die das ganze braucht 



```
BufferedImage bild= ImageIO.read(new File(loadF,en.nextElement()));
Image bildi

bildi=bild.getScaledInstance(newwidth, newheight, Image.SCALE_SMOOTH);
				
    int typ=bild.getType();
    bild= new BufferedImage(newwidth,newheight,typ);
    Graphics2D g2d= bild.createGraphics();
    start=System.currentTimeMillis();
    g2d.drawImage(bildi,0,0,null);
    g2d.dispose();
    ende=System.currentTimeMillis();

try{
    ImageWriter writer = ImageIO.getImageWritersByFormatName( "jpg" ).next(); 
    ImageOutputStream ios = ImageIO.createImageOutputStream( new File(saveF,name.getText()+index+".jpg") ); 
    writer.setOutput( ios ); 
    ImageWriteParam iwparam = new JPEGImageWriteParam( Locale.getDefault() ); 
    iwparam.setCompressionMode( ImageWriteParam.MODE_EXPLICIT ) ; 
    float i=1f;
    iwparam.setCompressionQuality( i); 
    writer.write( null, new IIOImage(bild, null, null), iwparam ); 
    ios.flush(); 
    writer.dispose(); 
    ios.close(); 
	
}catch(IOException IOE){System.out.println(IOE);}
			
System.out.println(ende-start);
```

Ich hab auch schon versucht das ganze mit 
Image.SCALE_FAST zu skallieren, aber dies hat nur einen Effekt auf die kleinen Bilder und nicht auf großen dort bleibt die Zeit die es braucht exakt gleich lang es


----------



## Illuvatar (7. Sep 2008)

Von getScaledInstance wird im Normalfall eher abgeraten, du könntest sowas mal noch probieren:

```
BufferedImage bild = ImageIO.read(new File(loadF,en.nextElement()));
BufferedImage scaled = new BufferedImage(newwidth, newheight, bild.getType());
Graphics2D g2d= scaled.createGraphics();
g2d.drawImage(bild, 0, 0, newwidth, newheight, null);
g2d.dispose();
```

Ansonsten: Wieso machst du das mit dem OutputStream eigentlich so kompliziert, und nicht einfach mit ImageIO#write(RenderedImage, String, File)?


----------



## AmunRa (7. Sep 2008)

Danke ich werd dies versuchen 

Ich mach das deswegen so kompliziert, da ich in einer anderen Quelle gelsesen hab das dies der bste weg ist wenn man  einen Kompressionsfaktor (Hoff das das der richtige Ausdruck ist ) angeben möchte und dies möchte ich in mein programm noch einbinden 

Wenn es anders besser geht bin ich für jeden Hinweis dankbar 

Thx
Michael


----------



## AmunRa (7. Sep 2008)

Hey Danke für die Hilfe 

mit dem neuen Befehl kann ich in 3 Sek 125 Bilder skallieren und speichern 

Warum ist dies eigentlich so?
Warum ist der Befehl .getScaledImage() so langsam?


----------



## Marco13 (7. Sep 2008)

Der "komplizierte" Weg ist afaik tatsächlich der einfachste, wenn man den Komprimierungsfaktor noch mit angeben will. ImageIO.write speichert mit "irgendeinem" Komprimierungsfaktor ab ....

Von getScaledInstance solltest du aber wegkommen .... schau auch mal hier http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html


----------

