 | Unser Angebot für Sie! Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'! |
| | | | | |
Zusammenfassung
Skalieren Sie Bilder mithilfe eines kleinen Access-Tools auf die gewünschte Größe.
Techniken
VBA, GDI
Voraussetzungen
Access 2000 oder höher
Beispieldateien
BilderSkalieren.mdb
Shortlink
624
Bilder skalieren
André Minhorst, Duisburg
Das Schöne an Access ist, dass man in ihm eine extrem flexible Entwicklungsumgebung hat, mit der man auch mal Aufgaben erledigen kann, die gar nichts mit Datenbanken zu tun haben. Wer beispielsweise Bilder auf eine bestimmte Größe bringen möchte, um diese per E-Mail an Freunde zu versenden und dabei keine übergroßen Anhänge produzieren möchte, ist mit der kleinen Anwendung in diesem Beitrag gut bedient: Diese erwartet lediglich die Angabe des Quell- und Zielpfads sowie der gewünschten Kantenlänge und skaliert die im Verzeichnis enthaltenen Bilder dann per Knopfdruck.
Wer gern mal Schnappschüsse mit der Digitalkamera macht und diese an Freunde verteilen oder auch auf seiner Webseite platzieren möchte, kann sicher auf andere Tools als Access zugreifen, um die Größe der betreffenden Bilder anzupassen. Aber ob das damit so einfach geht wie mit Access? Wir bauen in diesem Beitrag eine kleine Lösung, die lediglich aus einem Formular sowie dem Modul mdlGDIPlus von Sascha Trowitzsch besteht und das Anpassen der Bildgröße auf einfachste Weise erlaubt. Diese soll zwei Textfelder zur Eingabe der Verzeichnisse für die Originalbilder und die skalierten Exemplare, ein Textfeld für die Länge der längsten Kante sowie eine Schaltfläche zum Start des Skaliervorgangs bieten (s. Abb. 1).
Abb. 1: Mit dieser Access-Anwendung skalieren Sie Bilder.
Formularbau
Das Formular erfordert auch ohne die GDI-Funktionen schon ein wenig Arbeit: Sie benötigen zwei Textfelder zur Eingabe der beiden Verzeichnisse sowie zwei Schaltflächen, die jeweils den Verzeichnisauswahl-Dialog öffnen. Ein weiteres Textfeld nimmt die Länge der längsten Kante der Bilder auf und die Schaltfläche cmdSkalieren sorgt schließlich für das Skalieren der Bilder. Damit die Routine keinen Fehler auslöst, der auf fehlenden Informationen beruht, haben wir eine Validierung der drei Felder eingebaut.
Für weiteren Komfort speichert die Anwendung die Einstellungen der drei Textfelder in einer Tabelle - somit gibt es zumindest einen kleinen datenbanktechnischen Aspekt in dieser Anwendung. Die Beschreibung dieser Funktionen finden Sie übrigens im Beitrag Anwendungoptionen in Tabellen speichern (Shortlink 617). Diese Parameter liest das Formular direkt beim Start ein, und zwar mit der folgenden Routine, die Access beim Öffnen des Formulars auslöst. Gleichzeitig maximiert die Routine das Formular:
Private Sub Form_Open(Cancel As Integer)
DoCmd.Maximize
Me!txtVerzeichnis = _
GetDBOption("Quellverzeichnis")
Me!txtZielverzeichnis = _
GetDBOption("Zielverzeichnis")
Me!txtNeueLaenge = GetDBOption("NeueLaenge")
End Sub
Das Auswählen der Verzeichnisse erfolgt mithilfe der Routine OpenPathName, die eine nicht dokumentierte Funktion der WizHook-Klasse verwendet und die ein Klick auf die beiden Schaltflächen wie folgt aufruft:
Private Sub cmdVerzeichnisNeu_Click()
Me.txtZielverzeichnis = _
OpenPathName(CurrentProject.Path)
End Sub
Die Funktion OpenPathName selbst finden Sie im Modul mdlTools der Beispieldatenbank. Beim Schließen des Formulars soll dieses die in den Textfeldern angegebenen Einstellungen in einer Tabelle namens tblOptionen speichern. Dafür sorgen einige Aufrufe der Funktion SetDBOption in der Prozedur, die durch das Ereignis Beim Schließen des Formulars ausgelöst wird:
Private Sub Form_Close()
SetDBOption "Quellverzeichnis", _
Me!txtVerzeichnis
SetDBOption "Zielverzeichnis", _
Me!txtZielverzeichnis
SetDBOption "NeueLaenge", _
Me!txtNeueLaenge
End Sub
Vor dem Skalieren ...
Da fehlt doch noch was - richtig: das eigentliche Skalieren der Bilder.
Dies erledigt die Ereignisprozedur cmdSkalieren_Click. Sie deklariert zunächst die benötigten Elemente und wandelt den Mauszeiger in die Sanduhr um, damit der Benutzer weiß, dass die Anwendung arbeitet:
Private Sub cmdSkalieren_Click()
Dim strFilename As String
Dim objPicture As stdole.StdPicture
Dim objSize As TSize
Dim intX As Integer
Dim intY As Integer
Dim intAnzahl As Integer
Dim i As Integer
DoCmd.Hourglass True
Im zweiten Schritt folgt die Validierung der Textfelder. Die folgenden Anweisungen prüfen dabei, ob die angegebenen Verzeichnisse überhaupt vorhanden sind. Dabei kommt die Dir-Anweisung mit dem Parameter vbDirectory zum Zuge:
If (Len(Dir(Nz(Me!txtVerzeichnis, ""), _
vbDirectory)) = 0) _
Or (Dir(Nz(Me!txtVerzeichnis, ""), _
vbDirectory) = ".") Then
MsgBox "Bitte geben Sie ein gültiges " _
& "Quellverzeichnisse an."
Me!txtVerzeichnis.SetFocus
Exit Sub
End If
Das Gleiche geschieht im Anschluss mit dem Textfeld für das Zielverzeichnis (siehe Modul zum Formular frmBilderSkalieren). Auch den Inhalt des Felds zur Angabe der maximalen Länge prüft die Routine:
If Not IsNumeric(Me!txtNeueLaenge) Then
MsgBox "Bitte geben Sie eine Zahl " _
& "von 1 bis 5000 ein."
Me!txtNeueLaenge.SetFocus
Exit Sub
End If
If Nz(Me!txtNeueLaenge, 0) = 0 _
Or Nz(Me!txtNeueLaenge) > 5000 Then
MsgBox "Bitte geben Sie die neue Länge " _
& "als Zahlenwert von 1 bis 5000 an."
Me!txtNeueLaenge.SetFocus
Exit Sub
End If
Skalieren der Bilder
Das Skalieren selbst erfolgt in einer Schleife. Damit die Anwendung den Benutzer nicht nur durch die Sanduhr, sondern auch noch durch die Anzeige des Fortschritts über den Verlauf der Arbeiten informiert, soll die Statusleiste einen Text einblenden, der die Zahl der aktuell skalierten und die Gesamtzahl der Bilder anzeigt.
Dazu braucht man zunächst die Gesamtzahl. Um diese zu ermitteln, durchlaufen die folgenden Zeilen alle im Quellverzeichnis enthaltenen Dateien und erhöhen den Wert der Zählervariablen intAnzahl jeweils um 1:
strFilename = Dir(Me!txtVerzeichnis & "\")
Do While Len(strFilename) > 0
intAnzahl = intAnzahl + 1
strFilename = Dir
Loop
Eine wichtige Rolle spielt dabei die Dir-Funktion. Sie ermittelt zunächst die erste Datei im angegebenen Verzeichnis.
Die folgende Do While-Schleife läuft solange, bis die Dir-Funktion eine leere Zeichenkette zurückliefert, was bedeutet, dass keine weitere Datei mehr vorhanden ist. Wichtig ist, dass die Dir-Funktion hier keinen Parameter mehr erhält, um die jeweils nächste Datei des zu Beginn angegebenen Verzeichnisses zu ermitteln.
Dann durchläuft die Routine die Dateien erneut - diesmal allerdings skaliert sie diese auch.
Die Laufvariable i verwendet die Routine für die Ausgabe eines Ausdrucks wie Bilddatei x von y bearbeitet, wobei auch die oben ermittelte Gesamtzahl aus intAnzahl eingebaut wird. Beides schreibt die Methode SysCmd mit dem Parameter SysCmdSetStatus in die Statusleiste.
Die LoadPictureGDIP-Methode lädt die angegebenen Bilder jeweils in ein Objekt des Typs StdPicture. Die Routine GetDimensionsGDIP ermittelt die Maße des Bildes. Das folgende If...Then-Konstrukt prüft die Höhe und Breite des Bildes und nimmt den größeren Wert als Basis für die Berechnung der neuen Maße. Die Methode ResampleGDIP bringt das Bild schließlich in die gewünschte Größe und SavePicGDIPlus speichert es unter dem gewünschten Dateinamen im JPEG-Format mit wählbarer Ausgabequalität (hier: 80).Eine abschließende Statusmeldung bestätigt die Fertigstellung des Auftrags.
strFilename = Dir(Me!txtVerzeichnis & "\")
Do While Len(strFilename) > 0
i = i + 1
SysCmd acSysCmdSetStatus, "Bilddatei " & i _
& " von " & intAnzahl & " bearbeitet."
Set objPicture = LoadPictureGDIP( _
Me!txtVerzeichnis & "\" & strFilename)
objSize = GetDimensionsGDIP(objPicture)
If objSize.x > objSize.y Then
intX = Me!txtNeueLaenge
intY = objSize.y * intX / objSize.x
Else
intY = Me!txtNeueLaenge
intX = objSize.x * intY / objSize.y
End If
Set objPicture = ResampleGDIP(objPicture, _
intX, intY)
SavePicGDIPlus objPicture, _
Me!txtZielverzeichnis & "\" & _
strFilename, picTypeJPG, 80
strFilename = Dir
Loop
SysCmd acSysCmdSetStatus, _
"Bildskalierung fertig."
DoCmd.Hourglass False
Zusammenfassung und Ausblick
Mit der hier vorgestellten Anwendung skalieren Sie schnell eine Menge Bilder auf das gewünschte Format - egal, ob Sie diese per Mail verschicken oder auf eine Webseite hochladen möchten. Ausbaumöglichkeiten sind natürlich vorhanden: So könnte man die im Quellverzeichnis enthaltenen Bilder natürlich noch in einem ListView-Steuerelement anzeigen oder eine Funktion einbauen, die Fehler verhindert, wenn das Quellverzeichnis auch noch andere Dateien als nur Bilddateien enthält - in dieser Version werden solche Fehler nämlich nicht explizit behandelt.
|