Tipps & Tricks - Bilder skalieren

Mit Groovy-Skript in einem Prozess können Bilder in einem vorgegebenen Ordner automatisiert skaliert werden - z.B. um Thumbnails zu erstellen. Wechseln Sie dazu in das Modul Prozesse. Erstellen Sie einen neuen Prozess und entfernen Sie alle eventuell vorhandenen Elemente.

Legen Sie einen globalen Timer und anschließend einen Timer-Ereignisbehandler an. Wählen Sie im Eigenschaftendialog des Timer-Ereignisbehandlers auf dem Reiter "Timer-Ereignisbehandler" den zuvor angelegten globalen Timer aus.

Verbinden Sie eine neue Groovy-Aktion mit dem zuvor angelegten Timer-Ereignisbehandler. Öffnen Sie im Eigenschaftendialog der Groovy-Aktion den Intrexx Editor. Fügen Sie folgendes Skript ein:

import static groovy.io.FileType.FILES
import de.uplanet.lucy.server.scripting.groovy.ImageHelper

def dirImagePath = new File("IMAGE_DIRECTORY_PATH")
def strFileName
def strThumbnailName
def fileThumbnail

dirImagePath.eachFileRecurse(FILES){image ->
	if (!image.name.endsWith("_thumbnail.png"))
	{
		strFileName = image.name

		if(ImageHelper.isSupportedImageFormat(image.path))
		{
			strThumbnailName = "${strFileName[0..strFileName.lastIndexOf(".")-1]}_thumbnail.png"
			fileThumbnail    = new File(image.path, strThumbnailName)

			if (!fileThumbnail.file)
				ImageHelper.scaleImage(inputFile:image.path, outputFile:"${image.parent}/${strThumbnailName}", maxWidth:100, maxHeight:100)
			else
				g_log.warn("Thumbnail for image ${strFileName} already exists.")
		}
		else
		{
			g_log.error("Error creating thumbnail for ${strFileName}. Format is not supported.")
		}
	}
}

Das Import-Statement am Anfang des Skripts bindet die zum Skalieren benötigte Klasse "ImageHelper" ein. Anschließend werden die Variablen definiert. Mit

def dirImagePath = new File("IMAGE_DIRECTORY_PATH")

legen Sie fest, in welchem Verzeichnis nach den zu skalierenden Bildern gesucht werden soll. Geben Sie hier statt "IMAGE_DIRECTORY_PATH" den gewünschten Zielpfad an (z.B. c:/scale-images). Mit der Anweisung

dirImagePath.eachFileRecurse(FILES)

werden rekursiv alle Dateien innerhalb des angegebenen Startverzeichnisses bearbeitet. Mit der anschließenden if-Abfrage

if (!image.name.endsWith("_thumbnail.png"))

wird sichergestellt, dass nur jene Dateien verarbeitet werden, die nicht selber bereits generierte Thumbnail-Bilder sind. Im nächsten Schritt wird überprüft, ob es sich bei dem übergebenen Bild um ein unterstütztes Dateiformat handelt oder nicht. Ist das Format gültig, wird ein skaliertes Thumbnail erstellt. Liegt ein Format vor, dass von der Klasse "ImageHelper" nicht unterstützt wird, wird eine entsprechende Fehlermeldung in der log-Datei des Prozesses ausgegeben. Mit der Zeile

def strThumbnailName = "${strFileName[0..strFileName.lastIndexOf(".")-1]}_thumbnail.png"

erstellen Sie einen neuen Dateinamen für das Thumbnail-Bild. Hierbei wird zur besseren Identifikation an den ursprünglichen Dateinamen das Suffix "_thumbnail" angehängt. Das in diesem Beispiel generierte Thumbnail wird im PNG-Format abgespeichert. Das Format kann bei Bedarf geändert werden. Unterstützt werden die Formate PNG, JPEG und BMP. Die eigentliche Skalierung des ursprünglichen Bildes erfolgt über die scaleImage-Methode des ImageHelpers. Die Skalierung erfolgt nur, wenn zu der gegebenen Datei noch kein Thumbnail-Bild vorliegt. Dies wird über die vorangestellte if-Abfrage überprüft.

if (!fileThumbnail.file)
ImageHelper.scaleImage(inputFile:image.path, outputFile:"${image.parent}/${strThumbnailName}", maxWidth:100, maxHeight:100)

Der Aufruf dieser Methode erfolgt über sogenannte named parameter. Dies bedeutet, dass die Parameter in der Form parameter:wert übergeben werden und die Parameter einen fest definierten Namen besitzen. Die beiden Parameter "inputFile" und "outputFile" sind Pflichtparameter, alle weiteren sind optional. Folgende Parameter stehen zur Verfügung:

Name

Beschreibung

inputFile

Pflichtparameter - die Eingabedatei als File-Objekt (java.io.File) oder als String (Pfadangabe relativ zum Portalverzeichnis).

outputFile

Pflichtparameter - die Ausgabedatei als File-Objekt (java.io.File) oder als String (Pfadangabe relativ zum Portalverzeichnis).

format

Ausgabeformat des skalierten Bildes (PNG, JPEG oder BMP). Defaultwert ist hierbei PNG.

width

Die Breite des skalierten Bildes.

height

Die Höhe des skalierten Bildes.

maxWidth

Die maximale Breite des skalierten Bildes. Das Bild wird auf diesen Wert unter Beibehaltung der Seitenverhältnisse skaliert.

maxHeight

Die maximale Höhe des skalierten Bildes. Das Bild wird auf diesen Wert unter Beibehaltung der Seitenverhältnisse skaliert.

scaleX

Der horizontale Skalierungsfaktor, mit dem das Bild skaliert wird.

scaleY

Der vertikale Skalierungsfaktor, mit dem das Bild skaliert wird.

shrinkOnly

Hat dieser Parameter den Wert true, so wird das Bild nur skaliert, wenn das resultierende Bild kleiner als das ursprüngliche Bild ist. shrinkOnly kann nur in Verbindung mit maxWidth oder maxHeight verwendet werden.

Die Parameter width, maxWidth und scaleX bzw. height, maxHeight und scaleY schließen sich gegenseitig aus und können nicht gemeinsam verwendet werden. Schließen Sie den Skript-Editor und speichern Sie den Prozess. Starten Sie den Globalen Timer über das Kontextmenü "Globalen Timerjob starten". Wenn der Prozess fehlerfrei gelaufen ist, finden Sie in dem Verzeichnis, das Sie im Skript angegeben haben, zu jedem unterstützten Bild ein skaliertes Vorschaubild.