{"id":55000778,"date":"2011-06-01T00:00:00","date_gmt":"2020-05-22T22:03:12","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=778"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bilder_mit_OGL_und_GDI_im_Griff","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/","title":{"rendered":"Bilder mit OGL und GDI im Griff"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Mit Access 2010 gibt es wieder mal neue Anforderungen, wenn es um den Zugriff auf Bilddokumente per VBA-Code geht. Der Anspruch der in diesem Beitrag vorgestellten Module zum Einlesen, Speichern und Anzeigen von Bilddateien in Access-Datenbanken ist es, unabh&auml;ngig von der Windows- und Access-Version zuverl&auml;ssig zu arbeiten (Ausnahme: Access 2010 64-bit).<\/b><\/p>\n<p>Die Beispieldatenbank enth&auml;lt einige Module mit Funktionen rund um Bilder.<\/p>\n<p>Wenn Sie die nachfolgend beschriebenen Techniken in eigenen Datenbanken einsetzen wollen, importieren Sie dort die folgenden Module:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>mdlOGL0710<\/b><\/li>\n<li class=\"aufz-hlung\"><b>mdlBLOBS0710<\/b><\/li>\n<li class=\"aufz-hlung\"><b>mdlOLE<\/b><\/li>\n<\/ul>\n<p><b>Grundlagen<\/b><\/p>\n<p>Bilder treten in den folgenden Beispielen in mehreren Formen auf:<\/p>\n<ul>\n<li class=\"aufz-hlung\">als Datei,<\/li>\n<li class=\"aufz-hlung\">als Picture-Objekt in einer Variablen oder <\/li>\n<li class=\"aufz-hlung\">in einem OLE- oder Anlagefeld einer Tabelle.<\/li>\n<\/ul>\n<p>Die Bilder werden beispielsweise an folgenden Stellen verwendet (einige Beispiele finden Sie am Ende des Beitrags):<\/p>\n<ul>\n<li class=\"aufz-hlung\">in Symbolleisten und Kontextmen&uuml;s,<\/li>\n<li class=\"aufz-hlung\">im ImageList-Steuerelement und somit in TreeView- und ListView-Steuerelementen,<\/li>\n<li class=\"aufz-hlung\">im Bildsteuerelement,<\/li>\n<li class=\"aufz-hlung\">als Icon im Ribbon (ab Access 2007) und<\/li>\n<li class=\"aufz-hlung\">als Icon von Schaltfl&auml;chen (ab Access 2007).<\/li>\n<\/ul>\n<p>Normalerweise beginnt der Lebenslauf eines Bildes in Zusammenhang mit einer Access-Anwendung in Form einer Datei auf der Festplatte &#8211; etwa im Format <b>.png<\/b>, <b>.gif<\/b>, <b>.bmp<\/b>, <b>.tif <\/b>oder auch <b>.ico<\/b>. Die erste Aufgabe lautet daher, auf die gew&uuml;nschte Bilddatei zuzugreifen und diese in der Datenbank verf&uuml;gbar zu machen &#8211; am besten in Form einer Variablen des Typs <b>StdPicture<\/b>.<\/p>\n<p>Die folgenden Beispiele f&uuml;hren wir anhand von Dateien im <b>.png<\/b>-Format durch. Dieses Format unterst&uuml;tzt Transparenz und kann &uuml;berall problemlos eingesetzt werden.<\/p>\n<p><b>Einmal Dateisystem und zur&uuml;ck<\/b><\/p>\n<p>Das erste Beispiel zeigt, wie Sie eine Bilddatei in eine Variable laden. Dass das funktioniert, l&auml;sst sich am einfachsten nachweisen, indem wir das Bild in der gleichen Prozedur wieder im Dateisystem speichern. Die Bilddatei wird mit der Prozedur <b>LoadPictureGDIP <\/b>in einer Variable des Typs <b>StdPicture <\/b>gespeichert. <b>LoadPictureGDIP <\/b>erwartet mindestens den Dateinamen als Parameter. Gegebenenfalls k&ouml;nnen Sie noch einen Wert f&uuml;r <b>FlattenColor <\/b>angeben. Diesen Parameter lernen Sie sp&auml;ter kennen. <\/p>\n<p>Das Speichern des Bildes erledigt die Methode <b>SavePicGDIPlus<\/b>. Diese erwartet die Objektvariable, den Dateinamen und den Bildtyp als Parameter:<\/p>\n<pre>Public Sub BilddateiLadenUndSpeichern()\r\n    Dim objPicture As StdPicture\r\n    Dim strPfadQuelle As String\r\n    Dim strPfadZiel As String\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\Screenshot.png&quot;\r\n    strPfadZiel = CurrentProject.Path &amp; &quot;\\Screenshot_Kopie.png&quot;\r\n    Set objPicture = LoadPictureGDIP(strPfadQuelle)\r\n    SavePicGDIPlus objPicture, strPfadZiel, pictypePNG\r\nEnd Sub<\/pre>\n<p><b>Bilder in der Datenbank speichern<\/b><\/p>\n<p>Wenn Sie kleinere Bilder in einer Anwendung verwenden m&ouml;chten, um diese etwa im Ribbon, in Kontextmen&uuml;s, auf Schaltfl&auml;chen oder im TreeView als Icon anzuzeigen, sollten Sie diese innerhalb der Datenbank speichern. Dazu gibt es zum Beispiel die folgenden beiden Varianten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">im OLE-Feld einer Tabelle<\/li>\n<li class=\"aufz-hlung\">im Anlage-Feld einer Tabelle (ab Access 2007)<\/li>\n<\/ul>\n<p>Die folgenden beiden Abschnitte zeigen beide Vorgehensweisen.<\/p>\n<p><b>Bild aus Datei in OLE-Feld speichern<\/b><\/p>\n<p>Bilder speichern Sie mit der Funktion <b>SaveFileToOLEField <\/b>im OLE-Feld einer Tabelle. Die Funktion erwartet die folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strFilename<\/b>: Name der Quelldatei<\/li>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Zieltabelle<\/li>\n<li class=\"aufz-hlung\"><b>strOLEField<\/b>: OLE-Feld der Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>boolEdit<\/b> (optional): Soll das Bild in einem bestehenden Datensatz gespeichert werden<\/li>\n<li class=\"aufz-hlung\"><b>strIDField<\/b> (optional): Prim&auml;rschl&uuml;sselfeld der Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>varID<\/b> (optional): Wenn <b>boolEdit <\/b>den Wert <b>True <\/b>erh&auml;lt, geben Sie hier die ID des Zieldatensatzes an, sonst k&ouml;nnen Sie hier&uuml;ber die ID des neuen Datensatzes entnehmen.<\/li>\n<\/ul>\n<p>Die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-anchor\">Listing 1<\/a><\/span> etwa speichert ein Bild in einem neuen Datensatz der Tabelle <b>tblBilder<\/b> und tr&auml;gt nachtr&auml;glich den Namen der Bilddatei ein.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Bild aus Datei in OLE-Feld speichern<\/p>\n<pre>Public Sub BilddateiInOLEFeld()\r\n    Dim strPfadQuelle As String\r\n    Dim lngID As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\Screenshot.png&quot;\r\n    If mdlOLE.SaveFileToOLEField(strPfadQuelle, &quot;tblBilder&quot;, &quot;Bild&quot;, False, &quot;ID&quot;, lngID) Then\r\n         db.Execute &quot;UPDATE tblBilder SET Bildname = ''&quot; &amp; strPfadQuelle &amp; &quot;'' WHERE ID = &quot; &amp; lngID, dbFailOnError\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese Prozedur verwendet den Parameter <b>lngID<\/b>, um die ID des neuen Datensatzes zu speichern. Damit kann sie dann direkt danach auf diesen Datensatz zugreifen und weitere Felder f&uuml;llen &#8211; wie hier etwa das mit dem Dateinamen des Bildes.<\/p>\n<p>Wenn Sie eine Bilddatei in einen bestehenden Datensatz einf&uuml;gen m&ouml;chten, verwenden Sie einen Aufruf wie den aus der Prozedur in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-29-anchor\">Listing 2<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Bild aus Datei in OLE-Feld speichern, diesmal in einem bestehenden Datensatz<\/p>\n<pre>Public Sub BilddateiInOLEFeld_BestehenderDatensatz()\r\n    Dim strPfadQuelle As String\r\n    Dim lngID As Long\r\n    Dim lngResultat As Variant\r\n    lngID = 25\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\Screenshot.png&quot;\r\n    lngResultat = SaveFileToOLEField(strPfadQuelle, &quot;tblBilder&quot;, &quot;Bild&quot;, True, &quot;ID&quot;, lngID)\r\n    If lngResultat = True Then\r\n         Debug.Print &quot;Erfolgreich gespeichert!&quot;\r\n    Else\r\n         Debug.Print &quot;Es ist ein Fehler aufgetreten: &quot; &amp; lngResultat &amp; &quot; &quot; &amp; AccessError(lngResultat)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur legt fest, dass das angegebene Bild im Feld <b>Bild <\/b>der Tabelle <b>tblBilder <\/b>gespeichert werden soll, deren Feld <b>ID <\/b>den Wert <b>25 <\/b>besitzt. Das Ergebnis sieht in beiden F&auml;llen wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_03\/GDIPlus-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Ein in einem OLE-Feld gespeichertes Bild<\/span><\/b><\/p>\n<p><b>Bild aus OLE-Feld in Datei speichern<\/b><\/p>\n<p>Andersherum funktioniert es nat&uuml;rlich auch. Vielleicht haben Sie ja eine Datenbank mit einer gro&szlig;en Menge Icons im OLE-Feld einer Tabelle und m&ouml;chten diese mal schnell auf die Festplatte kopieren. Dann verwenden Sie die Prozedur <b>SaveOLEFieldToFile <\/b>des Moduls <b>mdlOLE<\/b> wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-30-anchor\">Listing 3<\/a><\/span>. Diese Prozedur erwartet die folgenden Parameter:<\/p>\n<p class=\"listingueberschrift\">Listing 3: Bild aus einem OLE-Feld in eine Datei speichern<\/p>\n<pre>Public Sub OLEFEldInBilddatei()\r\n    Dim strPfadZiel As String\r\n    Dim lngID As Long\r\n    strPfadZiel = CurrentProject.Path &amp; &quot;\\BildAusOLEFeld.png&quot;\r\n    lngID = 25\r\n    SaveOLEFieldToFile &quot;tblBilder&quot;, &quot;ID&quot;, lngID, &quot;Bild&quot;, strPfadZiel\r\nEnd Sub<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Quelltabelle<\/li>\n<li class=\"aufz-hlung\"><b>strIDField<\/b>: Prim&auml;rschl&uuml;sselfeld<\/li>\n<li class=\"aufz-hlung\"><b>lngID<\/b>: Wert des Prim&auml;rschl&uuml;ssels f&uuml;r den Datensatz, aus dem das Bild gespeichert werden soll<\/li>\n<li class=\"aufz-hlung\"><b>strOLEField<\/b>: Name des OLE-Feldes<\/li>\n<li class=\"aufz-hlung\"><b>strFilename<\/b>: Name der Zieldatei<\/li>\n<\/ul>\n<p><b>Bild aus Datei in Anlagefeld speichern<\/b><\/p>\n<p>Seit Access 2007 gibt es das Anlagefeld, in dem sich Bilder sogar ganz leicht &uuml;ber die Benutzeroberfl&auml;che speichern lassen. Nat&uuml;rlich wollen Sie dies auch automatisiert per VBA erledigen. Die dazu notwendigen Prozeduren finden Sie im Modul <b>mdlBLOB0710<\/b>.<\/p>\n<p>Zum Anlagefeld ist zu sagen, dass es nicht wie ein OLE-Feld direkt in der Tabelle steckt, sondern dass es sich dabei prinzipiell um eine versteckte, per 1:n-Beziehung verkn&uuml;pfte Tabelle handelt. Nach au&szlig;en hin bedeutet dies, dass Sie mehrere Bilder in einem einzigen Datensatz speichern k&ouml;nnen.<\/p>\n<p>Daher haben die Methoden zum Speichern und Auslesen von Bildern in Anlagefeldern einen Parameter mehr als die f&uuml;r den Zugriff auf OLE-Felder. Damit geben Sie noch den Namen der jeweiligen Datei an.<\/p>\n<p>Die Methode <b>StoreBLOB0710 <\/b>speichert eine Datei in einem Anlagefeld und erwartet die folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strFilename<\/b>: Name der Bilddatei<\/li>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Zieltabelle<\/li>\n<li class=\"aufz-hlung\"><b>strFieldAttach<\/b>: Name des Anlagefelds<\/li>\n<li class=\"aufz-hlung\"><b>boolEdit <\/b>(optional): Soll die Datei in einen neuen oder vorhandenen Datensatz geschrieben werden<\/li>\n<li class=\"aufz-hlung\"><b>strIDField <\/b>(optional): Name des Prim&auml;rschl&uuml;sselfeldes<\/li>\n<li class=\"aufz-hlung\"><b>varID <\/b>(optional): Wert des Prim&auml;rschl&uuml;sselfeldes, wenn das Bild in einem bestehenden Datensatz gespeichert werden soll<\/li>\n<li class=\"aufz-hlung\"><b>strAttachment <\/b>(optional): Name der Anlage, da mehrere Bilder pro Anlagefeld gespeichert werden k&ouml;nnen. Muss dem Dateinamen ohne Pfadangabe entsprechen!<\/li>\n<\/ul>\n<p>Wir zeigen nachfolgend drei Varianten zum Speichern einer Bilddatei in einem Anlagefeld:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Speichern in einem neuen Datensatz<\/li>\n<li class=\"aufz-hlung\">Speichern in einem bestehenden Datensatz &uuml;ber eine bestehende Anlage<\/li>\n<li class=\"aufz-hlung\">Speichern in einem bestehenden Datensatz als neue Anlage<\/li>\n<\/ul>\n<p>Die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 4<\/a><\/span> verwendet <b>StoreBLOB0710<\/b>, um eine Datei in einem Anlagefeld zu speichern und gleich im Anschluss den soeben erstellten Datensatz um den Dateinamen der Bilddatei zu erweitern.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Bild aus einer Datei in ein Anlagefeld speichern<\/p>\n<pre>Public Sub BilddateiInAnlage_NeuerDatensatz()\r\n    Dim strPfadQuelle As String\r\n    Dim lngID As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\Screenshot.png&quot;\r\n    If StoreBLOB0710(strPfadQuelle, &quot;tblAnlagen&quot;, &quot;Anlage&quot;, False, &quot;ID&quot;, lngID, &quot;Beispielbild&quot;) Then\r\n         db.Execute &quot;UPDATE tblAnlagen SET Anlagename = ''&quot; &amp; strPfadQuelle &amp; &quot;'' WHERE ID = &quot; &amp; lngID, dbFailOnError\r\n    End If\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Den so gespeicherten Anlage-Datensatz nimmt die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-47-anchor\">Listing 5<\/a><\/span> auf. Sie verwendet f&uuml;r den Parameter <b>boolEdit <\/b>den Wert <b>True<\/b>, weil ein bestehender Datensatz bearbeitet werden soll. Sie &uuml;bergibt einen vorgegebenen Wert f&uuml;r <b>varID <\/b>und gibt au&szlig;erdem f&uuml;r <b>strAttachment <\/b>den Namen der im vorherigen Beispiel gespeicherten Bilddatei an. Dadurch wird die Bilddatei erstens im gleichen Datensatz gespeichert und zweitens auch noch &uuml;ber die bestehende Datei mit dem gleichen Namen geschrieben. Die dritte Variante sieht &auml;hnlich aus, allerdings soll hier eine weitere Datei als zweites Element des Anlagefeldes gespeichert werden.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Bestehendes Bild in einem Anlagefeld &uuml;berschreiben<\/p>\n<pre>Public Sub BilddateiInAnlage_BestehenderDatensatz_BestehendeAnlage()\r\n    Dim strPfadQuelle As String\r\n    Dim lngID As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    lngID = 13\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\Screenshot.png&quot;\r\n    StoreBLOB0710 strPfadQuelle, &quot;tblAnlagen&quot;, &quot;Anlage&quot;, True, &quot;ID&quot;, lngID, &quot;Screenshot.png&quot;\r\nEnd Sub<\/pre>\n<p>Dazu geben wir einen alternativen Quellpfad an, &uuml;bergeben aber auch mit dem letzten Parameter <b>strAttachment <\/b>den im Quellpfad enthaltenen Dateinamen (s. Bild 2 aus.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Bild zu einem bestehenden Bild im Anlagefeld hinzuf&uuml;gen<\/p>\n<pre>Public Sub BilddateiInAnlage_BestehenderDatensatz_WeitereAnlage()\r\n    Dim strPfadQuelle As String\r\n    Dim lngID As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    lngID = 13\r\n    strPfadQuelle = CurrentProject.Path &amp; &quot;\\pic001.png&quot;\r\n    StoreBLOB0710 strPfadQuelle, &quot;tblAnlagen&quot;, &quot;Anlage&quot;, True, &quot;ID&quot;, lngID, &quot;pic001.png&quot;\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_03\/GDIPlus-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Ein Anlagefeld mit zwei verschiedenen Bilddateien<\/span><\/b><\/p>\n<p><b>Bild aus Anlagefeld in Datei speichern<\/b><\/p>\n<p>Nat&uuml;rlich k&ouml;nnen Sie die in einem Anlagefeld gespeicherten Bilddateien auch wieder ins Dateisystem schreiben. Dazu verwenden Sie die Prozedur <b>RestoreBLOB0710<\/b>, die folgende Parameter erwartet:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Tabelle, in der sich das Anlagefeld befindet<\/li>\n<li class=\"aufz-hlung\"><b>strFieldAttach<\/b>: Name des Anlagefeldes<\/li>\n<li class=\"aufz-hlung\"><b>strIDField<\/b>: Name des Prim&auml;rschl&uuml;sselfeldes der Quelltabelle<\/li>\n<li class=\"aufz-hlung\"><b>varID<\/b>: Wert des Prim&auml;rschl&uuml;sselfeldes<\/li>\n<li class=\"aufz-hlung\"><b>strFilename<\/b>: Gew&uuml;nschter Name der zu speichernden Datei<\/li>\n<li class=\"aufz-hlung\"><b>strAttachment <\/b>(optional): Dateiname im Anlagefeld, falls dieses mehr als eine Anlage enth&auml;lt<\/li>\n<\/ul>\n<p>Die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-61-anchor\">Listing 7<\/a><\/span> zeigt einen Beispielaufruf der Methode <b>RestoreBLOB0710<\/b>. In diesem Fall soll die erste Datei im Anlagefeld <b>Anlage <\/b>im Datensatz mit dem Wert <b>13 <\/b>f&uuml;r das Feld <b>ID <\/b>der Tabelle <b>tblAnlagen <\/b>gespeichert werden.<\/p>\n<p class=\"listingueberschrift\">Listing 7: Anlage auf der Festplatte speichern<\/p>\n<pre>Public Sub BilddateiAusAnlagefeldSpeichern()\r\n    Dim strPfadZiel As String\r\n    Dim lngID As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    lngID = 13\r\n    strPfadZiel = CurrentProject.Path &amp; &quot;\\Screenshot1.png&quot;\r\n    RestoreBLOB0710 &quot;tblAnlagen&quot;, &quot;Anlage&quot;, &quot;ID&quot;, lngID, strPfadZiel\r\nEnd Sub<\/pre>\n<p>Sollte dieses Anlagefeld mehr als eine Anlage enthalten, k&ouml;nnen Sie mit dem letzten Parameter den Dateinamen der zu exportierenden Datei angeben.<\/p>\n<p><b>Bild aus OLE-Feld lesen<\/b><\/p>\n<p>Wenn Sie ein in einem OLE-Feld gespeichertes Bild irgendwo innerhalb der Access-Anwendung anzeigen m&ouml;chten, m&uuml;ssen Sie dieses zun&auml;chst auslesen und in einer <b>StdPicture<\/b>-Variablen speichern.<\/p>\n<p>Dies erledigen Sie mit der Methode <b>PicFromField <\/b>des Moduls <b>mdlOGL0710<\/b>. Dieser Methode m&uuml;ssen Sie als Parameter ein <b>Field<\/b>-Objekt &uuml;bergeben, das dem OLE-Feld entspricht, in dem sich das Bild befindet. Wie dies funktioniert, zeigt die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-49-anchor\">Listing 8<\/a><\/span>. Um zu beweisen, dass die Variable <b>objPicture <\/b>auch tats&auml;chlich ein Bild enth&auml;lt, wird es in der folgenden Anweisung noch auf der Festplatte gespeichert.<\/p>\n<p class=\"listingueberschrift\">Listing 8: Bild aus OLE-Feld in einem StdPicture-Objekt speichern<\/p>\n<pre>Public Sub OLEInStdPictureSpeichern()\r\n    Dim db As DAO.Database\r\n    Dim objPicture As StdPicture\r\n    Dim rst As DAO.Recordset\r\n    Dim fld As DAO.Field\r\n    Dim lngID As Long\r\n    lngID = 25\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT Bild FROM tblBilder WHERE ID = &quot; &amp; lngID)\r\n    Set fld = rst.Fields(0)\r\n    Set objPicture = PicFromField(fld)\r\n    mdlOGL0710.SavePicGDIPlus objPicture, CurrentProject.Path &amp; &quot;\\test.gif&quot;, pictypeGIF\r\nEnd Sub<\/pre>\n<p><b>Bild aus Anlagefeld lesen<\/b><\/p>\n<p>Auch bei Verwendung eines Anlagefeldes zum Speichern der Bilddateien f&uuml;r eine Anwendung m&uuml;ssen Sie den Inhalt zun&auml;chst in ein <b>StdPicture<\/b>-Element &uuml;bermitteln.<\/p>\n<p>Dies erledigt die Prozedur <b>AttachmentToPicture<\/b>. Sie erwartet die folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Name der Tabelle, in der sich das Anlagefeld befindet<\/li>\n<li class=\"aufz-hlung\"><b>strAttachmentField<\/b>: Name des Anlagefeldes<\/li>\n<li class=\"aufz-hlung\"><b>strImage<\/b>: Name der Bilddatei<\/li>\n<\/ul>\n<p>Die Funktionsweise des Aufrufs dieser Prozedur erl&auml;utert das Beispiel aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-50-anchor\">Listing 9<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 9: Bild aus Anlagefeld in einem StdPicture-Objekt speichern<\/p>\n<pre>Public Sub AttachmentInStdPictureSpeichern()\r\n    Dim objPicture As StdPicture\r\n    Set objPicture = AttachmentToPicture(&quot;tblAnlagen&quot;, &quot;Anlage&quot;, &quot;Screenshot.png&quot;)\r\n    SavePicGDIPlus objPicture, CurrentProject.Path &amp; &quot;\\test1.gif&quot;, pictypeGIF\r\nEnd Sub<\/pre>\n<p><b>Bildabmessungen ermitteln<\/b><\/p>\n<p>F&uuml;r den einen oder anderen Fall d&uuml;rften die Bildma&szlig;e interessant sein. Diese liefert die Funktion <b>GetDimensionsGDIP<\/b>.<\/p>\n<p>Diese Funktion gibt allerdings nicht direkt die H&ouml;he und die Breite zur&uuml;ck, sondern ein Objekt des Typs <b>TSize<\/b>, das so definiert ist:<\/p>\n<pre>Public Type TSize\r\n    X As Double\r\n    Y As Double\r\nEnd Type<\/pre>\n<p>Die folgende Routine deklariert ein solches Objekt, liest ein Bild in das Objekt <b>objPicture<\/b> ein und ermittelt dann dessen Abmessungen. Schlie&szlig;lich gibt sie die x- und die y-Koordinate, also die H&ouml;he und die Breite, in Pixel im Direktfenster aus (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-51-anchor\">Listing 10<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 10: Bildabmessungen ermitteln<\/p>\n<pre>Public Sub Bildabmessungen()\r\n    Dim objPicture As StdPicture\r\n    Dim T As TSize\r\n    Set objPicture = AttachmentToPicture(&quot;tblAnlagen&quot;, &quot;Anlage&quot;, &quot;Screenshot.png&quot;)\r\n    T = mdlOGL0710.GetDimensionsGDIP(objPicture)\r\n    Debug.Print &quot;Das Bild hat die Ma&szlig;e &quot; &amp; T.X &amp; &quot; x &quot; &amp; T.Y &amp; &quot;.&quot;\r\nEnd Sub<\/pre>\n<p><b>Einen Teil eines Bildes ausschneiden<\/b><\/p>\n<p>Mit der Funktion <b>CropImage <\/b>k&ouml;nnen Sie aus einem in einer <b>StdPicture<\/b>-Variablen gespeicherten Bild einen Bereich ausschneiden und in einer weiteren <b>StdPicture<\/b>-Variablen speichern.<\/p>\n<p><b>CropImage <\/b>erwartet die folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>image<\/b>: <b>StdPicture<\/b>-Objekt, aus dem ein Bereich ausgeschnitten werden soll<\/li>\n<li class=\"aufz-hlung\"><b>X<\/b>: Linker Rand des Ausschnitts<\/li>\n<li class=\"aufz-hlung\"><b>Y<\/b>: Oberer Rand des Ausschnitts<\/li>\n<li class=\"aufz-hlung\"><b>Width<\/b>: Breite des Ausschnitts<\/li>\n<li class=\"aufz-hlung\"><b>Height<\/b>: H&ouml;he des Ausschnitts<\/li>\n<\/ul>\n<p>Die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-52-anchor\">Listing 11<\/a><\/span> speichert die linken oberen 100 x 100 Bildpunkte eines Bildes zun&auml;chst in einem neuen <b>StdPicture<\/b>-Objekt und dann in einer Datei auf der Festplatte.<\/p>\n<p class=\"listingueberschrift\">Listing 11: Teil eines Bildes ausschneiden<\/p>\n<pre>Public Sub AusschnittEinesBildesSpeichern()\r\n    Dim objPicture As StdPicture\r\n    Dim objAusschnitt As StdPicture\r\n    Set objPicture = AttachmentToPicture(&quot;tblAnlagen&quot;, &quot;Anlage&quot;, &quot;Screenshot.png&quot;)\r\n    Set objAusschnitt = CropImage(objPicture, 1, 1, 100, 100)\r\n    SavePicGDIPlus objPicture, CurrentProject.Path &amp; &quot;\\Ausschnitt.png&quot;, pictypeGIF\r\nEnd Sub<\/pre>\n<p><b>Gr&ouml;&szlig;e eines Bildes &auml;ndern<\/b><\/p>\n<p>Mit der Methode <b>ResampleGDIP <\/b>&auml;ndern Sie die Gr&ouml;&szlig;e eines Bildes.<\/p>\n<p>Die Methode erwartet die folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>image<\/b>: Verweis auf das anzupassende <b>StdPicture<\/b>-Objekt<\/li>\n<li class=\"aufz-hlung\"><b>Width<\/b>: Gew&uuml;nschte Breite<\/li>\n<li class=\"aufz-hlung\"><b>Height<\/b>: Gew&uuml;nschte H&ouml;he<\/li>\n<\/ul>\n<p>Das Beispiel aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-53-anchor\">Listing 12<\/a><\/span> zeigt, wie ein <b>StdPicture<\/b>-Objekt aus einem Anlagefeld eingelesen, die Gr&ouml;&szlig;e angepasst und das angepasste Bild auf der Festplatte gespeichert wird.<\/p>\n<p class=\"listingueberschrift\">Listing 12: Gr&ouml;&szlig;e eines Bildes anpassen<\/p>\n<pre>Public Sub GroesseEinesBildesAendern()\r\n    Dim objPicture As StdPicture\r\n    Dim objKleinesPicture As StdPicture\r\n    Set objPicture = AttachmentToPicture(&quot;tblAnlagen&quot;, &quot;Anlage&quot;, &quot;Screenshot.png&quot;)\r\n    Set objKleinesPicture = ResampleGDIP(objPicture, 100, 100)\r\n    SavePicGDIPlus objKleinesPicture, CurrentProject.Path &amp; &quot;\\Groesse.png&quot;, pictypegif\r\nEnd Sub<\/pre>\n<p><b>Bild in Kontextmen&uuml; anzeigen (ab Access 2002)<\/b><\/p>\n<p>Wenn Sie Kontextmen&uuml;s dynamisch per VBA programmieren, k&ouml;nnen Sie mit den in diesem Beitrag vorgestellten Methoden leicht Icons anzeigen. In der Beispieldatenbank finden Sie unter <b>frmKontextmen&uuml; <\/b>ein Formular, bei dem Sie per Klick mit der rechten Maustaste das Kontextmen&uuml; aus Bild 3 anzeigen. Damit dies gelingt, wird mit der folgenden Prozedur beim Laden des Formulars eine Routine aufgerufen, welche das Kontextmen&uuml; erstellt und speichert:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_03\/GDIPlus-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Kontextmen&uuml; mit Icons<\/span><\/b><\/p>\n<pre>Private Sub Form_Load()\r\n    PopupAnlegen\r\nEnd Sub<\/pre>\n<p>Diese Routine finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-55-anchor\">Listing 13<\/a><\/span>. Sie ist das eigentliche Arbeitstier dieses Beispiels: Zun&auml;chst deaktiviert sie die eingebauten Kontextmen&uuml;s f&uuml;r dieses Formular. Dann l&ouml;scht sie ein eventuell bereits vorhandenes Kontextmen&uuml; namens <b>Popup_Icons <\/b>und erstellt dieses anschlie&szlig;end neu. Die Men&uuml;eintr&auml;ge basieren s&auml;mtlich auf den Datens&auml;tzen der Tabelle <b>tblIcons<\/b>, welches im Feld <b>Icon <\/b>Bilddateien zur Anzeige im Kontextmen&uuml; speichert.<\/p>\n<p class=\"listingueberschrift\">Listing 13: Kontextmen&uuml; mit Icons erstellen<\/p>\n<pre>Private Sub PopupAnlegen()\r\n    Dim cbr As CommandBar\r\n    Dim cbb As CommandBarButton\r\n    Dim objPicture As StdPicture\r\n    Dim db As DAO.Database\r\n    Dim rstIcons As DAO.Recordset\r\n    Me.ShortcutMenu = False\r\n    On Error Resume Next\r\n    CommandBars(&quot;Popup_Icons&quot;).Delete\r\n    On Error GoTo 0\r\n    Set cbr = CommandBars.Add(&quot;Popup_Icons&quot;, msoBarPopup, False, True)\r\n    Set db = CurrentDb\r\n    Set rstIcons = db.OpenRecordset(&quot;SELECT * FROM tblIcons&quot;, dbOpenDynaset)\r\n    Do While Not rstIcons.EOF\r\n        Set cbb = cbr.Controls.Add(msoButtonIcon)\r\n        With cbb\r\n            .Caption = rstIcons!Iconname\r\n            Set objPicture = PicFromField(rstIcons!Iconobjekt)\r\n            If Not objPicture Is Nothing Then\r\n                cbb.Picture = objPicture\r\n                cbb.Mask = MaskFromPicture(objPicture)\r\n            End If\r\n        End With\r\n        rstIcons.MoveNext\r\n    Loop\r\nEnd Sub<\/pre>\n<p>Beim Durchlaufen einer auf dieser Tabelle basierenden Datensatzgruppe legt die Prozedur zun&auml;chst jeweils einen neuen Kontextmen&uuml;eintrag mit dem Namen des Bildes des aktuellen Datensatzes als Bezeichnung an. Dann stellt die Prozedur weitere Eigenschaften der Kontextmen&uuml;eintr&auml;ge ein. Entscheidend sind hier die beiden Eintr&auml;ge <b>Picture <\/b>und <b>Mask<\/b>. Kontextmen&uuml;s k&ouml;nnen immer noch keine transparenten Bilder anzeigen, daher kommt dort eine alternative Technik zum Einsatz. Die Eigenschaft <b>Picture <\/b>erh&auml;lt einen Verweis auf das dem Bild des aktuellen Datensatzes entsprechende und mit der Funktion <b>PicFromField <\/b>ermittelte <b>StdPicture<\/b>-Objekt. Da die Transparenz-Informationen hier verloren gehen, ben&ouml;tigen wir ein weiteres Bildobjekt f&uuml;r die Maske, die nur schwarze und wei&szlig;e Bildpunkte enth&auml;lt.<\/p>\n<p>Die wei&szlig;en stellen die transparenten Bereiche dar, die schwarzen die nicht transparenten.<\/p>\n<p>Gl&uuml;cklicherweise liefert das Modul <b>mdlOGL0710 <\/b>mit <b>MaskFromPicture <\/b>eine Funktion, die genau eine solche Maskendatei erstellt.<\/p>\n<p>Sp&auml;ter in der Entwurfsansicht f&uuml;hrt der Klick mit der rechten Maustaste zum Ausl&ouml;sen der folgenden Prozedur, die schlicht und einfach das soeben erstellte Kontextmen&uuml; mit der <b>ShowPopup<\/b>-Methode anzeigt:<\/p>\n<pre>Private Sub Detailbereich_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)\r\n    Select Case Button\r\n        Case 2\r\n            CommandBars(&quot;Popup_Icons&quot;).ShowPopup\r\n    End Select\r\nEnd Sub<\/pre>\n<p><b>Bild in ImageList laden und im TreeView anzeigen<\/b><\/p>\n<p>Im n&auml;chsten Beispiel geht es zun&auml;chst um das Laden von Icons aus der Tabelle <b>tblIcons <\/b>in ein <b>ImageList<\/b>-Steuerelement namens <b>ctlImageList<\/b>.<\/p>\n<p>Die darin gespeicherten Bilder sollen schlie&szlig;lich in einem TreeView-Steuerelement namens <b>ctlTreeView <\/b>angezeigt werden. Beide Elemente f&uuml;gen Sie zum Formular hinzu (in der Beispieldatenbank <b>frmImageListTreeView<\/b>) und deklarieren sie wie folgt:<\/p>\n<pre>Dim objTreeView As MSComctlLib.TreeView\r\nDim objImageList As MSComctlLib.ImageList<\/pre>\n<p>Beim Laden des Formulars wird die folgende Ereignisprozedur ausgel&ouml;st, welche die beiden Objekte zuweist und zwei Prozeduren zum F&uuml;llen des <b>ImageList<\/b>&#8211; und des <b>TreeView<\/b>-Steuerelements aufruft:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objTreeView = Me!ctlTreeView.Object\r\n    Set objImageList = Me!ctlImageList.Object\r\n    ImageListFuellen\r\n    TreeViewFuellen\r\nEnd Sub<\/pre>\n<p>Die Funktion <b>ImageListFuellen <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-57-anchor\">Listing 14<\/a><\/span> nimmt zun&auml;chst einige Grundeinstellungen am ImageList-Steuerelement vor. Dann durchl&auml;uft sie alle Datens&auml;tze eines Recordsets basierend auf der Tabelle <b>tblIcons <\/b>und f&uuml;hrt f&uuml;r jeden Datensatz die <b>Add<\/b>-Methode des <b>ListImages<\/b>-Objekts des ImageList-Steuerelements aus.<\/p>\n<p class=\"listingueberschrift\">Listing 14: ImageList mit Icons f&uuml;llen<\/p>\n<pre>Public Sub ImageListFuellen()\r\n    Dim db As DAO.Database\r\n    Dim rstIcons As DAO.Recordset\r\n    Dim i As Integer\r\n    Set db = CurrentDb\r\n    With ctlImageList\r\n        .ListImages.Clear\r\n        .ImageHeight = 16\r\n        .ImageWidth = 16\r\n        Set rstIcons = db.OpenRecordset(&quot;SELECT * FROM tblIcons&quot;, dbOpenSnapshot)\r\n        Do While Not rstIcons.EOF\r\n             i = i + 1\r\n            .ListImages.Add i, rstIcons!IconName, PicFromField(rstIcons!IconObjekt)\r\n            rstIcons.MoveNext\r\n        Loop\r\n    End With\r\nEnd Sub<\/pre>\n<p>Darin weist sie das mit der <b>PicFromField<\/b>-Methode gewonnene <b>StdPicture<\/b>-Objekt zum ImageList-Steuerelement hinzu.<\/p>\n<p>Schlie&szlig;lich muss noch das TreeView-Steuerelemente gef&uuml;llt werden, was die Prozedur <b>TreeViewFuellen <\/b>erledigt (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 15<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 15: TreeView-Steuerelemente mit Bildern aus dem ImageList-Steuerelement f&uuml;llen<\/p>\n<pre>Public Sub TreeViewFuellen()\r\n    Dim i As Integer\r\n    With objTreeView\r\n        Set .ImageList = Me!ctlImageList.Object\r\n        For i = 1 To objImageList.ListImages.count\r\n             .Nodes.Add , , &quot;a&quot; &amp; i, objImageList.ListImages.Item(i).Key, _\r\n            objImageList.ListImages.Item(i).Key\r\n        Next i\r\n    End With\r\nEnd Sub<\/pre>\n<p>Diese weist dem TreeView-Steuerelement das ImageList-Steuerelement als Lieferant f&uuml;r Icons zu und f&uuml;llt dann das TreeView-Steuerelement.<\/p>\n<p>Dabei legt es f&uuml;r jeden Datensatz der Tabelle <b>tblIcons <\/b>ein Element an und f&uuml;llt dieses mit dem entsprechenden Icon aus dem ImageList-Steuerelement (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_03\/GDIPlus-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: TreeView-Eintr&auml;ge mit Icons<\/span><\/b><\/p>\n<p><b>Bild im Ribbon anzeigen<\/b><\/p>\n<p>Fehlt noch das Ribbon, das ja gerade durch seine guten grafischen M&ouml;glichkeiten besticht.<\/p>\n<p>In diesem Fall wollen wir nur zeigen, wie Sie eine einfache Schaltfl&auml;che mit einem Icon versehen. Dazu verwenden wir die Ribbon-Definition aus Bild 5, die in der Tabelle <b>USysRibbons <\/b>gespeichert ist. Diese Definition enth&auml;lt einen Verweis auf eine Prozedur namens <b>loadImage<\/b>, die in einem Standardmodul gespeichert werden muss.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_03\/GDIPlus-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Die Tabelle USysRibbon speichert Ribbon-Definitionen.<\/span><\/b><\/p>\n<p>Diese Prozedur sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 16<\/a><\/span> aus. Sie erstellt wiederum mit der Funktion <b>PicFromField <\/b>ein <b>StdPicture<\/b>-Objekt auf Basis der in der Tabelle <b>USysImages <\/b>gespeicherten Bilddatei.<\/p>\n<p class=\"listingueberschrift\">Listing 16: Bilder in Steuerelemente des Ribbons laden<\/p>\n<pre>Public Sub loadImage(control, ByRef image)\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim fld As DAO.Field\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT ImageObject FROM USysImages WHERE ImageName = ''&quot; &amp; control &amp; &quot;''&quot;)\r\n    Set fld = rst!ImageObject\r\n    Set image = PicFromField(fld, &amp;HFFFFFF)\r\nEnd Sub<\/pre>\n<p>Wichtig ist hier, dass Sie wie folgt einen Farbwert f&uuml;r den Parameter <b>FlattenColor <\/b>&uuml;bergeben, da das Image sonst beim Aktivieren der Ribbon-Schaltfl&auml;che nicht transparent bleibt:<\/p>\n<pre>Set image = PicFromField(fld, &amp;HFFFFFF)<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit der neuen Version der GDI-Module von Sascha Trowitzsch fahren Sie auch mit Access 2007 und 2010 sehr gut. Die nicht weiter besprochene Besonderheit dieser Module ist, dass die API-Funktionen jeweils f&uuml;r mehrere Versionen der Grafik-DLL von Windows\/Office deklariert wurden und automatisch je nach Bedarf zum Einsatz kommen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Bilder2000Bis2003.mdb<\/p>\n<p>Bilder2000Bis2010.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{3D52374D-6BE2-45AA-AE43-C4B62004714F}\/aiu_778.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit Access 2010 gibt es wieder mal neue Anforderungen, wenn es um den Zugriff auf Bilddokumente per VBA-Code geht. Der Anspruch der in diesem Beitrag vorgestellten Module zum Einlesen, Speichern und Anzeigen von Bilddateien in Access-Datenbanken ist es, unabh&auml;ngig von der Windows- und Access-Version zuverl&auml;ssig zu arbeiten (Ausnahme: Access 2010 64-bit).<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662011,66032011,44000026],"tags":[],"class_list":["post-55000778","post","type-post","status-publish","format-standard","hentry","category-662011","category-66032011","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bilder mit OGL und GDI im Griff - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bilder mit OGL und GDI im Griff\" \/>\n<meta property=\"og:description\" content=\"Mit Access 2010 gibt es wieder mal neue Anforderungen, wenn es um den Zugriff auf Bilddokumente per VBA-Code geht. Der Anspruch der in diesem Beitrag vorgestellten Module zum Einlesen, Speichern und Anzeigen von Bilddateien in Access-Datenbanken ist es, unabh&auml;ngig von der Windows- und Access-Version zuverl&auml;ssig zu arbeiten (Ausnahme: Access 2010 64-bit).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:03:12+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Bilder mit OGL und GDI im Griff\",\"datePublished\":\"2020-05-22T22:03:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/\"},\"wordCount\":2622,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/261390fc0ac94a29a2927cd1a7d5bd9f\",\"articleSection\":[\"2011\",\"3\\\/2011\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/\",\"name\":\"Bilder mit OGL und GDI im Griff - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/261390fc0ac94a29a2927cd1a7d5bd9f\",\"datePublished\":\"2020-05-22T22:03:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/261390fc0ac94a29a2927cd1a7d5bd9f\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/261390fc0ac94a29a2927cd1a7d5bd9f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_mit_OGL_und_GDI_im_Griff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bilder mit OGL und GDI im Griff\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bilder mit OGL und GDI im Griff - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/","og_locale":"de_DE","og_type":"article","og_title":"Bilder mit OGL und GDI im Griff","og_description":"Mit Access 2010 gibt es wieder mal neue Anforderungen, wenn es um den Zugriff auf Bilddokumente per VBA-Code geht. Der Anspruch der in diesem Beitrag vorgestellten Module zum Einlesen, Speichern und Anzeigen von Bilddateien in Access-Datenbanken ist es, unabh&auml;ngig von der Windows- und Access-Version zuverl&auml;ssig zu arbeiten (Ausnahme: Access 2010 64-bit).","og_url":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:03:12+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Bilder mit OGL und GDI im Griff","datePublished":"2020-05-22T22:03:12+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/"},"wordCount":2622,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f","articleSection":["2011","3\/2011","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/","url":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/","name":"Bilder mit OGL und GDI im Griff - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f","datePublished":"2020-05-22T22:03:12+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/261390fc0ac94a29a2927cd1a7d5bd9f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Bilder_mit_OGL_und_GDI_im_Griff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Bilder mit OGL und GDI im Griff"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000778"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000778\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}