skallieren von Bildern

Status
Nicht offen für weitere Antworten.

AmunRa

Gesperrter Benutzer
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

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

AmunRa

Gesperrter Benutzer
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

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

AmunRa

Gesperrter Benutzer
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


Code:
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

Top Contributor
Von getScaledInstance wird im Normalfall eher abgeraten, du könntest sowas mal noch probieren:
Code:
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

Gesperrter Benutzer
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

Gesperrter Benutzer
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?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben