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

Bisherige Kommentare:

RE: MDB

MDB

Alle Kommentare ansehen oder Kommentar abgeben

Über den Autor:

Alexander Sascha Trowitzsch

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

Zusammenfassung

Lernen Sie die GDI+-Bibliothek kennen und haben Sie Bilddateien unter VBA im Griff

Techniken

Bilder, GDI+, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

mdlGDIPlus.bas

Bilder im Griff mit VBA und GDI+

Sascha Trowitzsch, Berlin

Bilder und Access sind - verlässt man sich auf die Anzahl der Anfragen in Newsgroups und Foren - ein interessantes Gespann. Um richtig mit Bildern zu arbeiten, wäre es doch gut, per VBA etwa Bilddateien einzulesen, anzupassen oder unter einem anderen Datentyp wieder zu speichern. Wenn möglich, soll das Ganze auch noch ohne zusätzliche Tools funktionieren. Geht nicht? Doch: mit den richtigen Wrapper-Funktionen für die zuständige Windows-Bibliothek haben Sie Ihre Bilder schnell im Griff.

Bilder in Access

Für den Einsatz von Bilddateien in Access und in Office im Allgemeinen gibt es eine Menge Möglichkeiten: das Speichern von Bildern in der Datenbank, Icons, die in der Anwendung eingesetzt werden und so weiter. Das macht alles umso mehr Spaß, je flexibler der Umgang mit den Bildern wird.

Anforderungen an Bilddatenbank und Co.

Folgende grundlegende Anforderungen stellen sich technisch an Bilddatenbanken und ähnliche Projekte:

  • Bilddateien verschiedener Formate sollten geladen werden können.
  • Die Bilder sollten zur Erstellung von Vorschaubildern in brauchbarer Qualität skaliert (verkleinert) werden können.
  • Der Umfang des dazu benötigten Codes sollte überschaubar bleiben.
  • Externe Komponenten

    Da Access/VBA keine Funktionen dieser Art bereithält, ist dabei der Einsatz externer Komponenten gefragt. Zu den bekannteren und leistungsfähigeren kostenlosen Lösungen gehören das sehr komplexe ImageMagick und das etwas einfachere, aber auch kleinere FreeImage.

    Hinweis

    Im Beitrag Digitale Fotografien im Griff (Shortlink 315) können Sie nachlesen, wie sich die externe Anwendung ImageMagick per VBA ansprechen lässt. Dies ist vor allem interessant, wenn Sie komplexere Änderungen an Bildern vornehmen möchten - etwa um dynamisch einen Schriftzug in das Bild einzubetten. (

    Wie beim Einsatz von Komponenten von Drittherstellern üblich, kann man nicht voraussetzen, dass die benötigten Bibliotheken auf allen Zielrechnern der Anwendung vorhanden sind. Für die Weitergabe von Anwendungen ist dies denkbar schlecht - um den Benutzer nicht übermäßig zu strapazieren, müsste man schon eine Setup-Routine für die Anwendung inklusive zusätzlicher Komponenten mitliefern.

    Grafikfunktionen on Board

    Seit Windows XP liefert das Microsoft-Betriebssystem alles mit, was man benötigt - zwar werden die gewünschten Funktionen nicht auf dem Silbertablett präsentiert wie bei externen Komponenten, aber mit ein wenig Programmierarbeit lässt sich eine brauchbare Schnittstelle erzeugen. Auf diese Weise spart man sich das Installieren zusätzlicher Software und hat weiterhin eine Datenbankanwendung "aus einem Guss" - die .mdb-Datei enthält dann auch die Aufrufe der Methoden der GDI+-Bibliothek.

    Die Rohmaterialien in Form von API-Aufrufen finden Sie in der Bibliothek GDI+. Wie diese Bibliothek den Einsatz externer Komponenten überflüssig macht, zeigen die folgenden Abschnitte. GDI+ ist die Weiterentwicklung des Windows-GDI (GDI= Graphical Device Interface). Das ist die Sammlung von API-Funktionen, die in Windows für (fast) alle grafischen Operationen verantwortlich ist (daneben gibt es noch DirectX/DirectDraw, das aber erst im kommenden Windows Vista eine größere Rolle spielt).

    Alles, was Sie auf der Benutzeroberfläche zu sehen bekommen, ist also das Ergebnis von GDI-Funktionen. Mit Erscheinen von Windows XP hat Microsoft eine völlig neue Version des GDI auf den Markt gebracht und sie GDIPlus genannt. Sie hat mit dem alten GDI praktisch nichts mehr gemein und übertrifft dieses in Bezug auf Umfang, Komplexität und Aufbau um Welten. Aus Kompatibilitätsgründen ist natürlich weiterhin das alte GDI in Windows XP/Windows 2003 Server enthalten. Microsoft empfiehlt jedoch ausdrücklich in Anwendungen den Umstieg auf die neue Schnittstelle.

    GDI+ für (fast) alle

    Wer noch mit Windows-Versionen älter als Windows XP arbeitet und denkt, er findet in diesem Beitrag keine nützlichen Informationen mehr, kann beruhigt sein: Sie sind nämlich keineswegs gezwungen, auf Windows XP umzusteigen, um in den Genuss von GDI+ zu kommen.

    Microsoft bietet einen freien Download der GDIPLUS.DLL an, der bis zu W98 hinab einsetzbar ist (http://www.microsoft.com/downloads/
    details.aspx?FamilyID=6a63ab9c-df12-4d41-
    933c-be590feaa05a&DisplayLang=en, einfach in das Windows-Systemverzeichnis kopieren; eine Registrierung ist nicht erforderlich).

    Funktionen von GDI+

    In den Beispieldateien zu diesem Beitrag finden Sie ein Modul namens mdlGDIPlus (gespeichert unter dem Dateinamen mdlGDIPlus.bas), das viele Funktionen für den Zugriff auf Bilddateien über die GDI+-Bibliothek enthält - und dennoch nur einen winzigen Ausschnitt aus deren Welt zeigt. Wenn Sie das Modul in das VBA-Projekt einer Access-Datenbank importiert haben, können Sie auf die folgenden Funktionen zugreifen:

  • IsGDIPInstalled: Prüft, ob die GDI+-Bibliothek installiert ist.
  • InitGDIP: Initialisiert GDI+.
  • ShutDownGDIP: Räumt GDI+ auf (wichtig: da GDI+ objektorientiert programmiert ist, kann ein vergessenes Freigeben der Objekte zu Abstürzen führen).
  • LoadPictureGDIP: Lädt ein Bild mit dem als Parameter angegebenen Dateinamen in ein StdPicture-Objekt. Die Funktion unterstützt derzeit die folgenden Formate: bmp, gif, jp(e)g, tif, png, wmf, emf und ico.
  • ResampleGDIP: Skaliert das übergebene Picture-Objekt mit den angegebenen Dimensionen und schärft die neue Version gegebenenfalls.
  • MakeThumbGDIP: Erstellt ein Thumbnail aus einem Picture-Objekt. Das bedeutet, dass das Bild in einen Rahmen mit der angegebenen Breite und Höhe eingepasst und der Rand in der gewünschten Farbe gefüllt wird.
  • GetDimensionsGDIP: Liefert die Maße eines Picture-Objekts in Form einer TSize-Struktur, die die Höhe und Breite des Bildes in Pixeln enthält.
  • SavePicGDIPlus: Speichert ein Picture-Objekt in die Datei mit dem angegebenen Namen wahlweise als BMP, GIF, PNG oder JPG - Letzteres mit wählbarer Qualitätsstufe.
  • ArrayFromPicture: Liefert ein Byte-Array mit dem Bild als Inhalt zurück. Die enthaltene Funktion ist in Zusammenhang mit Access bisher einzigartig: Das Bild wird während der Umwandlung nicht in eine Datei gespeichert, sondern über ein OLE-Stream-Objekt in ein Byte-Array überführt. Der Code kommt ohne jegliche zusätzliche Type Library aus, weil er den Stream über das versteckte stdole.IUnknown erzeugt und dabei ausschließlich OLE-API-Funktionen verwendet. Diese Funktion ist für das Speichern eines Bildes in ein Binärfeld einer Tabelle (OLE-Datentyp) von Bedeutung.
  • ArrayToPicture: Diese Funktion ist das Pendant zu der zuvor beschriebenen Funktion ArrayFromPicture. Ein Binärfeld einer Tabelle kann damit in ein Bildobjekt umgewandelt werden.
  • Zusätzlich liefert das Modul noch einige Toolfunktionen:

  • GetIconPic: Liefert das Shell-Icon zu der Anwendung, die der per Dateinamen angegebenen Datei in Windows zugeordnet ist, als Picture-Objekt.
  • GetScreenRes: Ermittelt die aktuelle Bildschirmauflösung und liefert eine TSize-Struktur mit Höhe und Breite (Einheit Pixel).
  • BitmapToPicture: Erzeugt ein Picture-Objekt aus dem per Handle angegebenen Windows-Bitmap.
  • ShowhModFile: Gibt den Pfad und den Dateinamen der aktuell verwendeten GDI+-Bibliothek zurück (dient Kontrollzwecken).
  • GDI+-Funktionen im Einsatz

    Um die oben vorgestellten GDI+-Funktionen in Ihrer Datenbank zu verwenden, müssen Sie lediglich das Modul mdlGDIPlus in die gewünschte Datenbank importieren.

    Access und mehr

    Die Funktionen sind noch nicht einmal auf den Einsatz in Zusammenhang mit einer Datenbankanwendung beschränkt - Sie können mit ein wenig zusätzlicher Programmierung damit auch größere Änderungen an Bildbeständen als Batch durchführen.

    Ein konkretes Beispiel ist das Online-Archiv dieses Magazins unter http://www.access-im-unternehmen.de. Bei der Konvertierung der im Word-Format vorliegenden Original-Beiträge kamen die Funktionen GetDimensionsGDPI und ResampleGDPI zum Einsatz, um zu breite Bilder auf bestimmte Abmessungen zu skalieren.

    Fallstricke

    Die GDIPLUS.DLL gibt es, wie viele DLLs, in mehreren Ausführungen - in diesem Fall sind es zum Glück derzeit nur zwei: GDI+1.0 und GDI+1.1 (DLL-Dateiversionen 5.xx vs. 6.xx). Die Version 1.1 wird nur von einigen wenigen MS-Produkten installiert, unter anderem von Office 2003 (mindestens Service Pack 1) und den Office-Document-Viewern (beispielsweise der PowerPoint Viewer 2003, zu finden unter http://www.microsoft.com/downloads/details.aspx?familyid=428d5727-43ab-4f24-90b7-a94784af71a4&displaylang=de). Diese Anwendungen installieren die neuere GDIPLUS.DLL allerdings nicht in das Systemverzeichnis, sondern in das jeweilige Anwendungsverzeichnis. Das soll auch so sein, denn GDI+1.1 wird von Windows nicht offiziell unterstützt, seit es Sicherheitsprobleme (Exploits) mit dem Laden von JPG-Dateien durch GDI+ gab.

    Besonderheiten von GDI+ 1.1

    Der Nachteil ist, dass damit GDI+1.1 nicht allen Anwendungen zur Verfügung steht.

    Man könnte darauf an sich auch gut verzichten, hielte GDI+1.1 nicht einige Leckerbissen bereit, die in GDI+1.0 fehlen: Eine neue Abteilung "Effekte", mit der man etwa Bilder schärfen, weichzeichnen oder im Farbraum verändern kann. Und gerade das Nachschärfen von verkleinerten Vorschaubildern wäre für die Bilddatenbank ein gewünschtes Feature. Wir haben diese Funktionalität deshalb auch in das entsprechende Modul in der Datenbank aufgenommen.

    Hier kommen nun neue Probleme ins Spiel: Die oben genannte, offiziell von MS verteilte - und im Prinzip einzige erlaubte - ist die Version 1.0, die die erwähnten Effekte nicht enthält. Wer es mit seinem Gewissen ausmachen kann, der lädt sich zum Beispiel den MS PowerpointViewer 2003 herunter, installiert ihn und kopiert die im Zielverzeichnis liegende gdiplus.dll ins Windows-Systemverzeichnis.

    Wer Office2003 mit min. SP1 installiert hat, braucht den Powerpoint-Viewer nicht, weil dann im Office-Verzeichnis bereits die aktuellere gdiplus.dll enthalten ist.

    Das Kopieren ins Systemverzeichnis funktioniert im Übrigen nur unter Windows 2000 oder Windows 98, denn unter Windows XP und Windows 2003 Server schlägt sonst die Windows File Protection zu: Ein Überschreiben der im Systemverzeichnis vorhandenen gdiplus.dll ist sinnlos, weil sie von Windows sofort wieder gegen die "richtige" Version aus dem DLL-Cache ausgetauscht wird.

    Um diesem Schlamassel mit verschiedenen Versionen der GDI+-Bibliothek und unterschiedlichen Betriebssystemen aus dem Weg zu gehen, enthält das GDI+-Modul der Bilddatenbank einige Routinen, die automatisch die Version der gdiplus.dll ermittelt und außerdem dezidiert diejenige gdiplus.dll lädt, die im Office-Verzeichnis liegt - was etwa unter Office 2003 Service Pack 1 der Fall ist.

    Sollte es sich bei der geladenen DLL nicht um die Version GDI+1.1 handeln, so werden die Effekte und damit das Nachschärfen der Vorschaubilder deaktiviert.

    Es hat sich allerdings herausgestellt, dass das dezidierte Laden der gdiplus.dll im Office11-Verzeichnis leider noch keine Garantie dafür ist, dass diese DLL dann auch verwendet wird. Der Grund ist ein unter Windows XP neu eingeführter Mechanismus namens "side-by-side-assembling", der es erlaubt, dass mehrere Versionen ein und derselben DLL geladen sein können.

    Normalerweise ist es so, dass eine DLL unter Windows, einmal in das RAM geladen, von verschiedenen Anwendungen gemeinsam genutzt wird. XP kann das außer Kraft setzen und einer Anwendung eine zusätzliche DLL gleichen Namens spendieren. Im Fall der Bilddatenbank und GDIPLUS ist das unter Windows XP der Fall, weil spätestens seit Service Pack 1 aus Sicherheitsgründen eine "gdiplus-side-by-side-assembly" existiert.

    Obwohl also die Bilddatenbank die GDI+1.1-Version lädt, wird sie im laufenden Betrieb von Windows XP auf die im Sicherheitskatalog (WinSxS-Verzeichnis) liegende Version 1.0 "gepatcht" und die Effekte sind abermals verloren. Das Problem lässt sich mit folgendem Trick umgehen: Windows XP kennt eine Technik, die sich "dll redirection" nennt und die bewirken kann, dass eine Anwendung ausschließlich die DLLs verwendet, die in ihrem Anwendungsverzeichnis liegen. Für die Bilddatenbank handelt es sich hierbei um das Office-Verzeichnis, denn die Anwendung ist ja die msaccess.exe.

    Die "dll redirection" kann prinzipiell erzwungen werden, wenn eine Datei <anwendung.exe.local> im Anwendungsverzeichnis gefunden wird. Lange Rede, kurzer Sinn: Wenn Sie im Office11-Verzeichnis etwa mit Notepad eine (leere) Datei namens "msaccess.exe.local" anlegen, verwendet Access ausschließlich die gdiplus.dll, die im Office-Verzeichnis liegt - der Side-by-Side-Mechanismus tritt damit außer Kraft.

    Hartgesottene wechseln alternativ einfach die GDI+1.0-DLLs in den WinSxS-Verzeichnissen durch die neuere Version 1.1 aus. Die Windows File Protection lässt das merkwürdigerweise zu. Wir möchten Sie zu diesem Schritt aber nicht ermutigen.

    Download

    Download

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

    mdlGDIPlus.bas

    Beispieldateien downloaden

    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:

    Bisherige Kommentare

    R. Wolter schrieb am 2010-06-29 19:55:55:

    MDB

    Sind die Beispiel MDBs noch verfügbar? FG Roland Wolter

    Sascha Trowitzsch schrieb am 2010-06-29 20:51:12:

    RE: MDB

    Hallo R., Zu diesem Beitrag ist das Modul die einzige Downloaddatei. Der Beitrag war begleitend zu http://www.access-im-unternehmen.de/index1.php?id=300&BeitragID=338 Dort gibt´s wiederum die Bildverwaltung, welche dieses Modul verwendet. ;-) Sascha

    © 2003-2010 André Minhorst Alle Rechte vorbehalten.