Office: (Office 2016) Bilddaten aus Speicher direkt ins Image control laden

Helfe beim Thema Bilddaten aus Speicher direkt ins Image control laden in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo, ich möchte Bilddaten (Byte-Array) direkt vom Image control anzeigen lassen, jedoch ohne den Umweg der Erstellung eines BMP-Files und der... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Frank200, 8. Dezember 2020.

  1. Bilddaten aus Speicher direkt ins Image control laden


    Hallo,

    ich möchte Bilddaten (Byte-Array) direkt vom Image control anzeigen lassen, jedoch ohne den Umweg der Erstellung eines BMP-Files und der Zuweisung des Bildpfades an das Bildelement.

    Ich visualisiere Berechnungsergebnisse. Dabei erhalte ich ein 2-dimensionales Bytearray, welches ich bisher in ein BMP-File auf der Festplatte schreibe. Anschließend wird der Bildpfad dem Bildelement zugewiesen.
    Für kürzere Aktualisierungsintervalle suche ich eine Möglichkeit, die Bilddaten direkt ins Bildelement zu laden.

    Die Erstellung des BMP-Files geht auf dieses alte Thema von 2008 zurück: https://www.ms-office-forum.net/foru...12#post1069112
    Die Quelle für das Füllen des BMP-Files: http://www.vb-fun.de/cgi-bin/loadfra.../tip0253.shtml
    Dem Bytearray liegt ein 2-dimensionales Longarray zugrunde, in welchem jeder Wert den RGB-Wert eines Bildpixels repräsentiert.

    Füllen des BMP-Files (PixB() ist das Long-Array):
    Code:
    Die BMP-Struktur ist relativ simpel. Das Schreiben in die Datei ist kein Problem. Ich habe jedoch noch keinen Weg gefunden, die Daten dem Image-Control direkt zur Verfügung stellen.
    Gefunden habe ich etwas in https://www.vbforums.com/showthread....ol-from-memory in Post #8.
    Code:
    Allerdings erhalte ich einen Fehler bei MoveMemory ByVal lpMem, abPic(nLow), cbMem : Fehler 9 Index außerhalb des gültigen Bereiches.
    Ich vermute die Ursache darin, daß mein Byte-Array 2-dimensional ist. Wenn dem so ist, dann weiß ich nicht, wie es in ein 1-dimensionales transformiert werden kann, ohne das die Zeilenendeinformationen verloren gehen.

    Vielleicht kennt jemand einen anderen Weg oder kann mir helfen, diesen zum Laufen zu bringen?

    :)
     
    Frank200, 8. Dezember 2020
    #1
  2. //OT:
    Du visualisierst über Einzelpixel in einem Bild? Bei solch gnadenlos guten Augen ist mein Neid geweckt.

    Zur Frage: ich denke, das Bildcontrol will zwingend einen vollständigen Pfad, also eine gespeicherte Datei. Diese könnte man ja im Temp-Ordner ablegen und gleich nach erfolgter Verwendung wieder löschen.
     
  3. Hallo Eberhard,

    Dank. Haha, gemeint sind natürlich die Pixel des Bitmaps und nicht etwa die Bildschirmpixel (wenn ich Dich richtig verstanden habe).

    Den Weg mit der Datei gehe ich schon mehrere Jahre. Hinsichtlich der Akualisierungsrate ist jedoch das Speichern und anschließende Laden der Datei der zeitliche Knackpunkt (ca. 3-4 Bilder pro Sekunde). Für die ansatzweise Darstellung einer Bewegung wäre etwas mehr vorteilhaft. Aber es müssen auch keine 24 wie im Kino sein :-) . Ich hatte gehofft, das mit dem direkten Füllen des Imagecontrols hinzubekommen.
     
    Frank200, 10. Dezember 2020
    #3
  4. Bilddaten aus Speicher direkt ins Image control laden

    ... sind für Visualieren mit Erfassen und Verstehen des Inhalts auch eine Herausforderung.

    Um wieviel Bildpunkte geht es eigentlich? In nur einer Farbe?

    Um mal vom Ganzen etwas abzuweichen:
    Einen Fortschritt könnte man über eine Länge eines Labels mit einer Hintergrundfarbe recht gut darstellen. Flächenhafte Gebilde könnte man über das optische Zusammensetzen solcher Labels umsetzen.
     
  5. Du musst nur den BitmapFileHeader weg lassen, dann kannst du das Byte-Array der Eigenschaft PictureData zuweisen.

    Hiervon kannst du es ableiten.

    (Mein Beispiel aus #8)
     
    CatboyJones, 10. Dezember 2020
    #5
  6. \@Eberhard: Es ist ein kleines Bild mit 180x200 Pixeln, daß die Lage eines Körpers im Raum darstellt. Danke für den Hinweis mit den Labels - für andere Zwecke sicherlich eine geeignete Lösung.

    @CatboyJones: Vielen Dank!
    Es macht mich ein bißchen stolz, daß ich rein intuitiv schon auf den Gedanken gekommen bin :-) . Leider bekomme ich bei der Zuweisung des Byte-Arrays zu .PictureData folgenden Fehler:
    Error 2192, Die von Ihnen angegebene Bitmap liegt nicht im Format geräteunabhängiger Bitmapdateien (DIB-Erweiterung) vor.

    Ich vermute immernoch, daß es am Array-Format liegt. Das 2-dimensionale Byte-Array kann zwar direkt in das File geschoben werden (Put intBMPFile, , BmpData), doch beim Auslesen durch das Image-Control scheint ein 1-dimensionales Array erzeugt zu werden (evtl. Stichwort Byte-Stream ??). Die Information zu Breite und Höhe werden wohl aus dem Header entnommen. Wichtig ist ja vor allem die Anzahl der Pixel je Zeile. Die Zeilen stapeln sich dann halt übereinander.
    Ich habe mir Deine Beispieldatei angesehen. Da ist das relevante Byte-Array auch 1-dimensional (ReDim Buffer(lLength - 1 + 8)).

    Ich habe das Gefühl, ganz dicht dran zu sein. Aber ein Stück fehlt mir halt noch ...
    Noch ein Wort zu meinem Byte-Array: Es ist 2-dimensional.
    - Die erste Dimension steht für die Bildbreite (Anzahl der Bildpixel x 3 (je Bildpixel ein Rot-, Grün- und Blauwert) . BMP-spezifisch wird die Dimension bei Bedarf erweitert, bis sie durch 4 teilbar ist. Bei der ReDim-Anweisung wird -1 abgezogen, weil das Array null-basiert (0) ist.
    - Die zweite Dimension steht für die Anzahl der Bildzeilen.
     
    Frank200, 10. Dezember 2020
    #6
  7. Die Anzahl der Dimensionen ist bedeutungslos.
    Im Speicher ändert sich dadurch nichts.
    Du kannst jedes mehrdimensionale Array zu einem eindimensionalen "umkonfigurieren" ohne an der Organisation der Daten was zu ändern.
    Da geht es rein um die Adressierung beim Auslesen der Elemente durch VBA.
    Zum Lesen von Elementen muss bei jedem Zugriff berechnet werden, wo sich das Element befindet.

    Konzentriere dich also auf die Fehlermeldung.
     
    Zuletzt von einem Moderator bearbeitet: 14. Januar 2021
    markusxy, 10. Dezember 2020
    #7
  8. Bilddaten aus Speicher direkt ins Image control laden

    Hallo markusxy,

    vielen Dank für die Anregungen. Leider kommt die Fehlermeldung unverändert.

    Zwischenzeitlich habe ich zumindest schon mal sichergestellt, daß unter Bildtyp "Eingebettet" eingestellt ist. Da stand noch dem Standardwert "verknüpft". Ich war darauf gekommen, als ich testweise die Bilddaten von einem Bildelement zu einem anderen kopieren wollte (Me!Bild2.PictureData = Me!Bild1.PictureData) und die gleiche Fehlermeldung erhielt.

    Ich habe also versucht, mein zweidimensionales Array in eine eindimensionales zu konvertieren. Leider kommt immernoch die gleiche Fehlermeldung hinsichtlich des Bitmapformates.
    BmpData ist mein zweidimensionales Byte-Array, daß ich problemlos in die Bitmapdatei schieben kann.
    Code:
    Was mache ich hier falsch? Oder müssen da noch irgendwo Strukturinformationen eingefügt werden?
     
    Frank200, 10. Dezember 2020
    #8
  9. Die Konvertierung ändert nichts und hat auch mit dem Problem meiner Meinung nach nichts zu tun.

    Lies dich hier mal in das Thema Bitmap ein:
    https://docs.microsoft.com/de-de/win...lassifications


    Edit: Ich habe mich damit jetzt auch nicht tiefer beschäftigt.
    Vermutlich werden die DI Bitmaps für die Anzeige aber wieder in DD Bitmaps umgewandelt.
    Sollte es also Performance im Vordergrund stehen, müsste man vielleicht ein anderes Control verwenden, dass DD Bitmaps verwendet.
    Aber wie gesagt, weiß ich da auch zu wenig über die internen Abläufe.
    Ich hab bisher nur mit DD Bitmaps gearbeitet und die sind schneller als die Polizei erlaubt.
     
    markusxy, 10. Dezember 2020
    #9
  10. hallo
    wenn die von dir erzeugte datei tatsächlich eine bmp ist, so musst das was du in die datei schreibst nur in ein array scheiben (die header und das array mit den pixels) und dieses der picturedataeigenschaft zuweisen. vorraussetzung ist wohl aber das die entsprechende option für die datenbank gesetzt ist(speichern im neuen format).
     
  11. Hallo daolix,

    danke für den Vorschlag. Ich hatte bisher noch keinen Erfolg und bin daher für jede Anregung sehr dankbar.
    Ja, die Datei ist eine BMP. Sie kann vom Access-Image-Control geladen werden, sowie von Irfanview etc. - folglich nehme ich an, sie ist in Ordnung. Ich erzeuge sie wie in #1 gezeigt.

    Dein Hinweis zu den Datenbankoptionen war super! Ich hatte tatsächlich noch die Einstellung "... (mit Access 2003 und früher kompatibel)" und habe nun auf "Quellbildformat beibehalten" umgestellt. Damit habe ich erstmalig erreicht, daß kein Fehler ausgelöst wird !!! Leider wird das Bild (noch) jedoch nicht angezeigt.

    Das liegt wahrscheinlich an der Art und Weise, wie ich das Array (Headerdaten + Bilddaten) erzeugt habe. Da diese in unterschiedlichen Datentypen vorliegen, habe ich es mit einem Variant-Array versucht.
    Ich habe 2 Wege versucht:
    Versuch 1:
    Code:
    Hier erhalte ich bei der Zeile buff(0) = FileHead die Meldung "Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden oder an eine zur Laufzeit auflösbare Funktion übergeben werden."
    Ich habe schon versucht, die Variablendeklarationen Public FileHead As BITMAPFILEHEADER und Public InfoHead as BITMAPINFOHEADER, sowie die dazugehörigen Typdefinitionen (Public Type BITMAPFILEHEADER .... und Public Type BITMAPINFOHEADER ...) in ein allgemeines Modul zu legen, aber es kommt noch immer die gleiche Fehlermeldung.

    In Versuch2 habe ich die Elemente der Header einzel in das Array geschoben. Hier kommt kein Fehler - aber das Bild wird auch nicht angezeigt.
    Code:
    Wie sollte ich Deiner Meinung nach bei der Array-Erstellung vorgehen?
     
  12. Variant wäre natürlich richtig.
    Das sieht man, wenn man sich im Objektkatalog die Schnittstellen ansieht.
    Wenn dann aber so:

    Code:
     
  13. Bilddaten aus Speicher direkt ins Image control laden

    In dem von mir verlinkten Thread gibt es 3 funktionierende Demos.
    Schau dir das zweite an um das aktuelle Problem zu lösen.
    Wenn es insgesamt darum geht ein Bild zu zeichnen,
    dann schau dir das dritte an, um eine angemessene
    Lösung zu finden.

    Code:
     
    CatboyJones, 12. Dezember 2020
    #13
  14. Hallo,

    an erste Stelle nochmals herzlichen Dank an Euch für die Hilfe und Anregungen.
    Leider habe ich es bisher nicht geschafft, mein Ziel umzusetzen und die Daten, die ich schon so lange problemlos in ein bmp-File schreibe, in geeigneter Form dem Imagecontrol direkt als Futter anzubieten. Dabei ist mir durchaus klar, daß ich mich auf dünnem Eis bewege ;-). Mein Wissen und meine Erfahrungen in diesen Bereichen sind begrenzt, doch ich würde gern lernen.

    @daolix
    Der einfachste Weg, vorgeschlagen von daolix, beinhaltete, die Header und das Byte-Array in ein Variant packen und diese direkt der PictureData-Eigenschaft zuzuweisen.
    Es scheitert am Anfang: Die beiden Header sind benutzerdefinierte Typen. Sie können einem Variant nicht zugewiesen werden (Access 2016). Selbst wenn ich Typ- und Variantvariable als Public in allgemeinen Modulen definiere, erhalte ich bei varPD(0) = FileHead den Fehler: "Fehler beim Kompilieren: Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden oder an eine zur Laufzeit auflösbare Funktion weitergegeben werden."


    @CatbyJones
    Natürlich habe ich mir alle Deine drei Beispiele sehr genau angesehen und ich habe viel versucht, daraus für mich etwas abzuleiten. Wenn ich nicht ganz falsch liege, liegt die Besonderheit in meinem Fall in den Ausgangsdaten. Sie kommen nicht aus einem bestehenden Imagefile, sondern es sind zwei "händisch" erstellte Header und ein ebenfalls manuell gefülltes Bytearray - also drei separate Variablen.

    Ich hoffe, ich habe Dich richtig verstanden, daß Deine in Deinem letzten Post vorgeschlagene Funktion CreateShortBitMapStream() genau an diesem Punkt ansetzt. Sie übernimmt das Füllen von barray(), was sonst durch Auslesen des Files geschieht. Ich habe die Funktion SetImagePictureData() leicht angepaßt und versucht, die beiden CopyMemory-Schritte zu integrieren.

    Zunächst fiel mir auf, daß barray() durch CopyMemory nicht dimensioniert wird - sicher setzt Deine Funktion "Private Function CreateShortBitMapStream(barray() As Byte, ..." die Übergabe eines dimensionierten Arrays voraus.
    Ich habe daher versucht, barray() zu dimensionieren (siehe Zeile ReDim barray(Len(BIH) + ...). Ist das richtig?

    Momentan liefert CreateStdPictureFromBinary() ein False, was mit "StdPicture konnte nicht erstellt werden." quittiert wird. Innerhalb von CreateStdPictureFromBinary() gibt OleLoadPicture() nicht 0 (S_OK) zurück, sondern -2146827807.
    In der Folge bleibt oPic = Nothing.

    Sind meine Gedanken und Schritte richtig. Wie könnte ich weiter vorgehen?

    Code:
     
  15. hallo
    in deine ursprüngliche funktion statt dem speichern in eine Datei

    Code:
     
Thema:

Bilddaten aus Speicher direkt ins Image control laden

Die Seite wird geladen...
  1. Bilddaten aus Speicher direkt ins Image control laden - Similar Threads - Bilddaten Speicher Image

  2. Dropdown Auswahl -> anderer Wert Speichern

    in Microsoft Excel Hilfe
    Dropdown Auswahl -> anderer Wert Speichern: Hallo, ich habe folgende Tabelle: siehe Anhang. Ich möchte das mir beim Dropdown der Wert der Tabelle links angezeigt bekommt, aber der Wert Rechts in das Feld gespeichert wird. habe auf meiner...
  3. Werte per VBA automatisch übertragen und fortlaufend speichern

    in Microsoft Excel Hilfe
    Werte per VBA automatisch übertragen und fortlaufend speichern: Moin, ich habe da mal eine bitte: wie kann ich diesen Code dazu bringen von einer bestimmten Datei automatische Werte in eine andere Datei kopiert? Ich kann zwar die Werte in derselben Tabelle...
  4. MS Office 2021

    in Microsoft Outlook Hilfe
    MS Office 2021: Hallo, ich möchte alle .xml Anhänge in einem Ordner automatisch speichern mit einem Skript. Habe aber keine Ahnung wie das geht. Kann mir bitte jamand halfen?
  5. Speichern mit dem Titel der Zelle A2

    in Microsoft Excel Hilfe
    Speichern mit dem Titel der Zelle A2: Moin moin, Ich habe per Makro einen Arbeitsablauf aufgezeichnet der soweit auch funktioniert. Dieser Endet jedoch im "Speichern Unter" Fenster, welches durch das Klicken von "Drucken als PDF"...
  6. Formular nur Daten speichern

    in Microsoft Word Hilfe
    Formular nur Daten speichern: Ich versuche aus einem Formular mit Inhaltssteuerelementen ausschließlich die Daten zu speichern. Die Option in "Erweitert" in "Genauigkeit beim Freigeben" habe ich die Option "Formulardaten als...
  7. Bei speichern von Word als PDF keine Kommentare

    in Microsoft Word Hilfe
    Bei speichern von Word als PDF keine Kommentare: Liebe Kundige, als Lektorin bearbeite ich Buchmanskripte in Word und speichere die Bearbeitung mit sichtbaren Änderungen und Kommentaren als PDF. In letzter Zeit sind dann aber im PDF die...
  8. Excel VBA - Code Hilfe (Spalten, Werte kopieren etc.)

    in Microsoft Excel Hilfe
    Excel VBA - Code Hilfe (Spalten, Werte kopieren etc.): Hallo, ich benötige Hilfe für ein Problem, welches ich leider selbst schwerlich als Anfänger nicht lösen kann: Ich möchte von dem Tabellenblatt "Tabelle1" aus den Zellen B8:B14, K8:K14, B18:B25,...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden