Bilder schnell verkleinern

Benzol

Erfahrenes Mitglied
Mein Programm soll Bilder von einer Speicherkarte verkleinert in einer Liste darstellen können. Nun habe ich das schon soweit hinbekommen, die zu skalieren und neu Abzuspeichern, damit ich mit den kleinen Bildern noch arbeiten kann.
Das Problem ist jetzt, das er einfach ewigkeiten braucht, um die Bilder, welche mit einer 12 MP Kamera aufgekommen sind, anzuzeigen.
z.Z. sieht das in etwa so aus:

Code:
Image img = new ImageIcon(ImageIO.read(file)).getImage();

            Image scaledImage = img.getScaledInstance((int)width, (int)height,Image.SCALE_SMOOTH);

            BufferedImage outImg = new BufferedImage((int)width, (int)height,  BufferedImage.TYPE_INT_RGB);
            Graphics g = outImg.getGraphics();
            g.drawImage(scaledImage, 0, 0, null);
            g.dispose();
            
            String filename = name+file.getName();
            //Neue JPG-Datei erstellen
            File newfile = new File(tmpdir+""+filename);
            
            ImageIO.write(outImg, "jpeg", newfile);
Kennt jemand noch eine Methode, die das sehr viel schneller erledigt?
Nun muss ich ja auch zwei Thumbnails erstellen. Ein großes und ein kleines. Nun erstelle ich zwar schon extra von dem großen das kleine, aber sonderlich viel schneller geht es trotzdem nicht.
Auch würde es mich interessieren, wie sich Bilder verlustfrei drehen lassen... falls jemand nen Link hat, darf er ihn gerne so btw posten :p
 
Schuss ins Blaue:
http://www.yeo.id.au/jmagick/

Die Lösung hat mehrere Nachteile (u.a. Plattformabhängigkeit), und ob es hinterher tatsächlich schneller geht, weiss ich nicht -> Prototyp.

Ist der Code multithreaded?

Laut API-Doku wird durch Image.SCALE_SMOOTH ein Skalierungsalgorithmus gewählt, der Qualität bevorzugt. Welchen Vorteil bringt an dieser Stelle ein Image.SCALE_FAST?
 
Der Code zum kleinrechnen läuft noch nicht in einem seperaten Thread. Da ich allerdings einen Statusbalken einbauen wollte, und die Programmoberfläche ja hängt beim erstellen, denke ich, das ich das noch machen werde.

SCAL_FAST hat einen Vorteil von ein paar Sekunden. Bringt nicht wirklich viel und die Bilder sehen bescheiden aus. Mann sollte die Gesichter doch noch erkennen können ;)

Das mit der Plattformunabhängigkeit ist relativ egal. Das Programm wird hier Firmenintern laufen und ich glaube kaum, das wir in Zukunft auf Mac oder Linux wechseln werden.
 
Ich habe jetzt eine Methode gefunden, die deutlich schneller arbeitet. Ich denke, der Flaschenhals ist nicht das laden der Datei über den Kartenleser sondern das verkleinern mit getScalesInstance.
Habe jetzt eine Funktion die so aussieht

Code:
            BufferedImage bsrc = ImageIO.read(file);
            BufferedImage outImg = new BufferedImage((int)width, (int)height,  BufferedImage.TYPE_INT_RGB);
            Graphics2D g = outImg.createGraphics();
            AffineTransform at = AffineTransform.getScaleInstance((double)width/bsrc.getWidth(), (double)height/bsrc.getHeight());
            g.drawRenderedImage(bsrc,at);
           
            g.dispose();
Das Problem an der ganzen Sache ist jetzt, das die Vorschaubilder extrem Körnig sind. Wenn jemand von Euch da vllt. einen Lösungsansatz hätte... finde bei google so langsam nichts mehr über Bild-Verkleinerung :)
 
Das habe ich ebefalls schonprobiert mit dem Key... nur leider scheint sich das nur auf Linien oder Formen zu beziehen... das Bild sah nach dem einfügen kein bisschen besser aus :(
 
Gibt es nicht eine Möglichkeit, von anfang an zu sagen, das ich nur z.B. jedes 3 Pixel haben möchte? Das wäre immer noch absolut ausreichend, wenn man das dann nochmal verkleinert.
Habe das verkleinern jetzt in einem eigenen Thread laufen mit Statusbalken, jetzt merkt man erstmal, wie langsam das geht... :eek: Das Problem sind einfach die ganz großen Bilddateien. Lässt sich evtl. etwas an der JVM umstellen, das der dann besser mit dem kleinrechnen zurecht kommt? Sogar Paint bekommt das schneller hin :)
 

Neue Beiträge

Zurück