DllStruct to bitmap

  • Hey,

    weiß zufällig jemand wie man ein DllStruct in eine Bitmap umwandelt?

    DllStruct wird erstellt durch:

    Code
    $tPixel = DllStructCreate("dword[" & $iWidth * $iHeight & "];", DllStructGetData($tBitmapData, "Scan0"))

    Danach werden die Pixel je nach Algorithmus durch andere ersetzt und dafür bräuchte ich eine Möglichkeit wie man jetzt auf einfachem Wege das Struct nochmals als gleicher Typ der Variable $tBitmapData neu zuweist. ImageSaveToStream bekomm ich nicht zum Laufen, zeigt alles schwarz an

  • Danach werden die Pixel je nach Algorithmus durch andere ersetzt und dafür bräuchte ich eine Möglichkeit wie man jetzt auf einfachem Wege das Struct nochmals als gleicher Typ der Variable $tBitmapData neu zuweist.

    Was für ein Satz... habe ihn min. 10x gelesen und bin mir immer noch nicht sicher, ob ich ihn verstehe.

    Du willst die geänderten Pixel aus $tPixel nach $tBitmapData kopieren? Wieso änderst du sie nicht gleich in $tBitmapData?

    Ansonsten denke ich mal so:

    DllStructSetData($tBitmapData, "Scan0", DllStructGetData($tPixel)

    ImageSaveToStream bekomm ich nicht zum Laufen, zeigt alles schwarz an

    Ja super, mit dem Satz können wir jetzt auch unheimlich viel anfangen... aber ok, ich besorge mir schnellstmöglich eine Glaskugel und du schau dir inzwischen das Bsp. zu _GDIPlus_ImageSaveToStream in der Hilfe an. 8o

    • Offizieller Beitrag

    DllStructGetData($tBitmapData, "Scan0")

    Es wäre erst mal nicht ganz unwichtig, wenn du uns den Aufbau deiner Struktur $tBitmapData mitteilst (lauffähige Minimalskripte werden von uns überhaupt sehr begrüßt).

    Laut deiner Befehlszeile ..., DllStructGetData($tBitmapData, "Scan0") ist "Scan0" ein Pointer, der auf ein DWORD-Array der Größe $iWidth * $iHeight verweist. Das ist alles, was man deinem Post entnehmen kann. Alles andere.... - wie Bitnugger bereits sagte: Glaskugel

  • Hi,

    warum erstellst du die DllStruct nicht an der Adresse der Bitmap und änderst die Pixel dort direkt?

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (29. Mai 2020 um 19:32)

  • Hier eine GDI+ Variante:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das Ergebnis sieht dann bei mir so aus:

    Dies ist aber sicher nicht das gewünschte Ergebnis...

    Was bewirken bei (($i)) die doppelten Klammern?

    Sorry, aber

    Zitat


    Danach werden die Pixel je nach Algorithmus durch andere ersetzt und dafür bräuchte ich eine Möglichkeit wie man jetzt auf einfachem Wege das Struct nochmals als gleicher Typ der Variable $tBitmapData neu zuweist. ImageSaveToStream bekomm ich nicht zum Laufen, zeigt alles schwarz an

    das verstehe ich nicht ganz. Ein simples Beispiel würde Licht ins Dunkele bringen., wie z.B. ich lade ein Bild, um es in Graustufen umzuwandeln.

    Die Doppelklammern sind nötig, damit das Array in der Struct (Bitmap) angesprochen werden kann.

    Beispiel:

    $tPixelData.Scan0(($i)) = Mod($i, 256) == DllStructSetData($tPixelData, 1, Mod($i, 256), $i)

    Hier ist die Struct als Byte deklariert, damit man die Farbkanäle direkt als rot, grün blau und alpha ansprechen kann.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hi,

    ich lade ein Bild, um es in Graustufen umzuwandeln.

    DAS hätte in den ersten Post gehört!

    Mir war schon klar, dass es sich wieder mal um ein YX-Problem handelt....

    Vorgehensweise, um Pixel in Graustufen umzuwandeln...

    Der Geschwindigkeit halber in ASM umgesetzt^^

    Das Prinzip zur Pixelbearbeitung:

    Ein 32-Bit-Pixel besteht aus 4Bytes AARRGGBB

    "Grau" entsteht u.a., wenn die 3 Werte von Rot, Grün und Blau GLEICH sind, idealerweise werden Rot, Grün, und Blau zusammengezählt, und durch 3 geteilt.

    Grau=(RR+GG+BB)/3

    Diesen Wert an RR, GG und BB schreiben, und aus dem Pixel wird "Grau"

    //EDIT Code angepasst, Konstante $srccopy

    Aber das Thema "Pixel" bearbeiten haben wir doch hier im Forum schon in den letzten 10 Jahren bis zum Exzess durchgenudelt....ggf. würde dem TE eine Suche im Forum helfen 8)

    Ohne weitere Infos ist doch alles nur :Glaskugel:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (31. Mai 2020 um 14:28)

  • Ohne weitere Infos ist doch alles nur :Glaskugel:

    Eben... sagte ich doch bereits in meinem ersten Post! ;)

    Allerdings funktioniert dein letztes Script bei mir nicht, weil einige Variablen nicht deklariert wurden:

    Einmal editiert, zuletzt von Bitnugger (29. Mai 2020 um 23:45)

  • Andy : Allerdings funktioniert dein letztes Script bei mir nicht, weil einige Variablen nicht deklariert wurden:

    Bei mir wird nur ein Error bzgl. $SRCCOPY angezeigt.

    Sobald man #include <WindowsConstants.au3> einbindet, oder Global Const $SRCCOPY = 0x00CC0020 direkt setzt, dann läuft es.

    EDIT : (nach Hinweis von Andy )

    Das Auskoppeln der Konstante $SRCCOPY aus der bestehenden UDF wurde hier nur als Möglichkeit angegeben, ist aber nicht zu empfehlen !

    Allerdings darf man keine Direktive wie #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 setzen, dann gibt es in der Tat diverse Deklarationsmeldungen.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    3 Mal editiert, zuletzt von Musashi (30. Mai 2020 um 23:42)

  • Allerdings darf man keine Direktive wie #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 setzen, dann gibt es in der Tat diverse Deklarationsmeldungen.

    Habe ich nicht... bis auf den Time Stamp, der als Kommentar eingefügt wird, ist das Script bis auf ein paar eliminierte Leerzeilen unverändert und schmeißt bei mir 4 Errors und 4 Warnings.

    Ich sehe aber gerade, dass Andy es zwischenzeitlich wohl geändert hat... hier die Version mit ein paar eliminierten Leerzeilen, die ich via Copy-Button in SciTE eingefügt hatte:

    Und ja, die aktuelle Version funktioniert, wenn die Zeile "Global Const $SRCCOPY = 0x00CC0020" eingefügt wird.

    Einmal editiert, zuletzt von Bitnugger (30. Mai 2020 um 03:12)

  • OT:

    Und ja, die aktuelle Version funktioniert, wenn die Zeile "Global Const $SRCCOPY = 0x00CC0020" eingefügt wird.

    Soviel zum Thema "evil Numbers" :Face:

    Wenn KONSTANTEN nicht in den entsprechenden Bibliotheken stecken(gelassen werden), sondern AutoIt diese Versionsweise lustig wechselt, dann weiss ich auch nicht mehr weiter....

    Ich habe keine Lust mehr auf diese "Versionitis". Und frage mich auch nicht, was eure GDIPlus.au3 von meiner unterscheidet. Die "alten" Funktionen und Konstanten da drin sind seit 18 Jahren existent...:Face:

    Texos,

    DllStructGetData($tBitmapData, "Scan0")

    ist mir eben gerade aufgefallen!

    Ich hatte in allen meinen Funktionen die Elementnamen in den Structs in die entsprechenden Nummern geändert, weil irgendwann von der AutoIt-Entwicklercrew die KONSTANTEN Namen geändert wurden.

    Bsp für die tagBITMAPINFO:

    $tBMI = DllStructCreate($tagBITMAPINFO)

    DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4) ;1 statt biSize, war früher Size

    DllStructSetData($tBMI, 2, $iWidth) ;2 statt biWidth, war früher Width

    DllStructSetData($tBMI, 3, -$iHeight)


    Probier mal, ob das bei dir auch der Fall sein könnte!

    Thread dazu hier RE: AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (30. Mai 2020 um 21:04)

  • Wenn KONSTANTEN nicht in den entsprechenden Bibliotheken stecken(gelassen werden), sondern AutoIt diese Versionsweise lustig wechselt, dann weiß ich auch nicht mehr weiter....

    [...]

    Und frage mich auch nicht, was eure GDIPlus.au3 von meiner unterscheidet. Die "alten" Funktionen und Konstanten da drin sind seit 18 Jahren existent... :Face:

    Was die Änderung bzw. Verlagerung von Konstanten in andere UDF's angeht, hast Du recht.

    Kann es im vorliegenden Fall (_WinAPI_BitBlt ... Konstante : $SRCCOPY) aber ggf. sein, dass $SRCCOPY schon lange in der <WindowsConstants.au3> enthalten ist, und nicht in der <GDIPlus.au3> ?

    Hier zwei Beiträge aus dem Jahr 2013 von Dir und name22 , die das zumindest nahelegen.

    Da mir die alten Versionen von AutoIt fehlen kann ich aber natürlich nicht prüfen, was wo included wurde. Ich gehe mal davon aus, dass Du kein Skript posten würdest, bei dem eine UDF fehlt ;).

    (im Changelog habe ich auch nichts gefunden, diese Auflistung ist aber nicht selten unvollständig)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Code im Post #8 angepasst, Konstante nun in der Funktion, unabhängig von der Version der GDIplus.au3 bzw. anderer einzubindender Bibliotheken.

    Btw., aktuell auf meinem Rechner ist die 3.3.14.5