Bildskalierung

Screenshot des Programms
Sie hatten bestimmt auch schon einmal das Problem, dass Sie mehrere Bilder auf einmal verkleinern wollten. Dies ist sehr umständlich, da man bei normalen Programmen jedes Bild einzeln öffnen, verkleinern und speichern muss. Diese Situation habe ich zum Anlass genommen eine kleine Java-Applikation zu schreiben, welche genau das ermöglicht.

Funktionsumfang

Das Programm soll natürlich primär eine, im vorhinein definierte, Menge an Bildern mit nur einem Klick in eine gewünschte Größe skalieren. Dabei soll es einerseits möglich sein entweder die gewünschte Breite, oder die gewünschte Höhe anzugeben, wobei die fehlende Größe so bestimmt wird, dass das Bild nicht verzerrt wird. Andererseits kann es natürlich auch sein, dass die Bilder auf jeden Fall eine feste Größe haben sollen und dabei die Verzerrung in Kauf genommen wird. Dazu kommt noch dass die Ergebnisbilder entweder in Graustufen, wie es für Publikationen meist nötig ist, oder in Farbe ausgegeben werden können.
Da die meisten Computer heutzutage einen Mehrkernprozessor haben, wollte ich die Konvertierung gerne auf mehrere Threads aufteilen, damit eine leichtere Parallelverarbeitung stattfinden kann. Dabei arbeitet jeder Thread für sich allein an einem Bild und holt sich, sobald er mit dem ersten fertig ist, das nächste aus einer allgemeinen Liste.
Die letzte Funktionalität ist die Speicherung der Einstellungen. Wenn man das Programm schließt, sollen Angaben wie Breite, Höhe, Threads und das Startverzeichnis für die Bildauswahl erhalten bleiben.

Realisierung

Das Programm besteht aus zwei Java-Klassen. Zum Ersten einer grafischen Oberfläche, mit der man die Bilder auswählen kann und die Werte für Höhe, Breite, Threads und Graustufen-, bzw. Farbkonvertierung setzt. Die andere Klasse ist für die Skalierung zuständig. Jedes neue Objekt von ihr läuft in einem eigenen Thread und arbeitet parallel zu den anderen. Die Objekte haben alle eine Referenz auf eine gemeinsame Liste, in der die noch zu skalierenden Bilder stehen. Bei einer Konvertierung wird zunächst das Bild eingelesen, dann ein neues Image mit den richtigen Maßen erstellt und dort das eingelesene Bild in skalierter Form hinein gezeichnet. Anschließend muss das so entstandene Bild noch abgespeichert werden. Hierfür wird der orginale Dateiname genutzt und "_klein" angehängt.
Nachdem man eine Konvertierung gestartet hat werden die Einstelllungen in einer einfachen Textdatei gesichert. Diese wird beim nächsten Programmstart eingelesen und die Werte automatisch gesetzt.
Bei großen Bilddateien und vielen parallelen Threads kann es vorkommen, dass der Heap Space der Java Virtual Machine nicht ausreicht. Die Folge ist eine Exception und dass nicht alle Bilder skaliert werden. Damit dieses Problem nicht so leicht auftritt, wurde zum Starten eine Batch-Datei hinzugefügt, welche über java -jar -Xms1024m -Xmx1024m Bildskalierung.jar den Speicher auf 1GB erhöht. Damit nun nicht jedes Mal beim Starten ein Konsolenfenster erscheint, findet der Aufruf der Batch-Datei über ein Visual Basic Script statt:
Set WshShell = WScript.CreateObject( "WScript.Shell" ) WshShell.Run "Bildskalierung.bat",0,True

Download

Hier können Sie die verschiedenen Dateien herunterladen. Aus aktuellem Anlass weise ich darauf hin, dass die Dateien in dem zip-Archiv zuerst entpackt werden müssen, bevor das Programm gestartet werden kann.