Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

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'!

Diesen Beitrag twittern

Ihren XING-Kontakten zeigen

Diesen Beitrag Ihrem XING-Kontakten vorstellen

Diesen Beitrag auf Facebook teilen

Verwandte Beiträge:

Access 2007: Bilder und Schaltflächen

Bilder on the fly

Kontextmenüs von A bis Z

Bücherverwaltung

Bildverwaltung in Access

Alle verwandten Beiträge ansehen ...

Bisherige Kommentare:

Noch keine Kommentare vorhanden.

Alle Kommentare ansehen oder Kommentar abgeben

Über den Autor:

André Minhorst

Bitte nutzen Sie das XING-Profil nicht
für Fragen zum Artikel, sondern nur für
den Kontaktaustausch beziehungsweise
Projekt- oder Supportanfragen.

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).

pic001.tif

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.

Download

Download

Die .zip-Datei enthält folgende Dateien (.mdb-Dateien mit '00' im Dateinamen funktionieren in Access 2000 und höher):

BilderAnpassen.mdb

Beispieldateien downloaden

Verwandte Beiträge:

Access 2007: Bilder und Schaltflächen

Bilder on the fly

Kontextmenüs von A bis Z

Bücherverwaltung

Bildverwaltung in Access

Kommentare und Ergänzungen

Wenn Sie Kommentare, Fragen oder Ergänzungen zu diesem Artikel haben, können Sie diese hier eintragen. Wir bemühen uns, kurzfristig auf Ihren Kommentar einzugehen.

Ihr Name:

Ihre E-Mail-Adresse (für
Rückfragen, wird nicht veröffentlicht:

Betreff:

Ihr Kommentar zu diesem Artikel:

© 2003-2010 André Minhorst Alle Rechte vorbehalten.