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

  • 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?

  • Hier eine GDI+ Variante:

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

  • 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:

  • 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:

  • 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 ()

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

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


  • 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