Pixelgeneues Editieren eines Pixels im selbst geöffneten Fester/Bitmap

  • Hallo liebe Gemeinde,

    das ist meine ertse Meldung in diesem Forum.
    Zu AutoIt kam ich ... wie meist immer ... eher zufällig über einen Kollegen meiner Zuft.
    Ich hab auch schon Stunden im Forum verbracht und unmengen an Einträgen gelesen. Damit
    konnte ich meine ersten Ideen erfolgreich umsetzten. Das waren aber eher dateiorientierte Anwendungen - nicht so schwehr... benötigten keine Fester und Grafiken. (Mehrere Zip - Datein in einem Hauptverzeichnis mit vielen Unterverzeichnisen in die jeweiligen entpacken mit Anlage des "ZipVerzeichnisses")

    Nu möchte ich mich aber einem neuem Projekt zuwenden und dazu benötige ich Grafikfunktionen.

    Zum Projekt:

    Auch wenn es schon x-tausenmal gemacht wurde möchte ich die Mandelbrotmenge berechnen und mit verschiedenen varianten experimentieren.
    Hat bestimmt schon jeder mal gehört bzw. selbst gemacht / programiert.

    Zur Darstellung möchte ich ein Fenster öffen, ein leeres BMP (oder ähliches) drauflegen und dann pixelgenau verändern.

    Im Standardhandbuch gibt es keine Funtion, mit der ich ein Pixel auf einem Bild verändern kann - hab ich zumindest nicht gefunden. Im Forum fand ich GDI+ ... aber keinen Hinweis, wo ich es runterladen kann.
    Vieleicht hab ich ja auch nur den blöden aber eindeutigen Button nicht gesehen.... Damit soll es gehen...

    Fragestellung:

    - Wo finde ich GDI+ ... und hilft mir das ?
    - Wie könnte man so etwas realisieren - die graphische Komponente ?

    Mir geht es nicht um den Code - den möchte ich schon selbst finden. Es geht mir eher um den Gedankensprung mit welcher Funktion das zu bewerkstelligen ist.

    Ich sag schon mal Danke...
    ...vieleicht fällt Euch was ein.... ?(

    Wenn Du's eilig hast - geh langsam...

  • GDI+ ist in Windows inbegriffen und kannst du jederzeit nutzen.
    GDI+ sollte dir schon helfen, kenne mich jetzt aber zu wenig aus für ein konkretes Beispiel.

    Gruss Shadowigor

  • GDI+ ist eine DLL die ab Windows 2000 (glaube ich) standartmäßfig vorhanden ist. Um ein Pixel zu färben brauchst du erstmal ein Fenster. Du erstellst also eine GUI, besorgst dir die Graphic des GUI (

    [autoit]

    _GDIPlus_GraphicsCreateFromHWND()

    [/autoit]

    )

    Der Returnwert wird in eine Variable gespeichert, z.B. $hGraphics. Zum erstellen eines Backbuffers gibt es im Forum genug Beispiele (Damit es nicht flackert wenn man immer malt, da ansonsten immer direkt auf die Graphics gezeichnet wird)

    Eine "MalePixel" Funktion gibt es nicht, aber man kann auch einfach ein rechteck mit Größe 0, 0 malen ;)

    [autoit]

    _GDIPlus_GraphicsFillRect ($hGraphics, X, Y, 0, 0) ;; Bzw $hBackbuffer

    [/autoit]

    Ich empfehle das GDI+ Tutorial von Ubuntu. Einfach mal die SuFu nutzen, hast du ja Erfahrung drin :)

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Hi,
    mal unabhängig von der "Langsamkeit" des GDI ist das eine sehr schöne Aufgabe :D
    Man sollte erwähnen, dass es im AutoIt-GDI keinen "setpixel"-Befehl gibt.
    Man kann nun entweder per

    [autoit]

    _GDIPlus_GraphicsFillRect()

    [/autoit]

    ein 1x1 Rechteck setzen (schau dir in der Hilfe das Beispiel zu diesem Befehl an, da hast du dein komplettes Grundgerüst!!!) oder
    per API-Call ein Pixel im DeviceContext setzen

    Spoiler anzeigen
    [autoit]

    $user32 = DllOpen("user32.dll");dll-handle holen
    $gdi32 = DllOpen("gdi32.dll")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $GUI = GUICreate("Apfelmännchen", 200,200) ;Fenster erstellen
    $dc = GetDC(WinGetHandle($GUI)) ;Device Context des Fensters holen
    GUISetState(@SW_SHOW) ;Fenster anzeigen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $x=1 to 100 ;spalten
    for $y=1 to 100 ;zeilen
    $color= random(0,0xFFFFFF,1) ;zufallsfarbe (hier kommt der code fürs apfelmännchen hin^^)
    setpixel($dc,$x,$y,$color) ;pixel setzen
    next
    next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    while GUIGetMsg()<>-3 ;fenster schließen
    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func setpixel($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
    DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
    EndFunc ;==>pix

    [/autoit] [autoit][/autoit] [autoit]

    Func GetDC($handle)
    $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
    EndFunc ;==>GetDC

    [/autoit]
  • Ansonsten gibt es auch noch eine SetPixel(bitmap,x,y,color) funktion in der GDIP.au3. Um die zu finden, einfach mal googeln, der erste eintrag ist es warscheinlich. Sollte um einiges effizienter sein als mit drawrect, und gerade bei der mandelbrotmenge muss man ja viele pixel setzen. Zur erklärung der funktion gibt es die MSDN auf der microsoft seite, die funktion ist ja nur der aufruf der SetPixel funktion in der Gdiplus.dll ;)

    Meine Werke


    EasyScreen (teilweise Crocoframe): <EasyScreen>
    Spotify2Title: <Spotify2Title> (zur Info, dies ist KEIN Spotify-Downloader! Wer das dachte... :rofl: sowas gibts hier nicht :thumbdown: )

  • zum Thema Mandelbrot, weil gestern im Chat die Sprache drauf kam^^
    Apfelmaennchen in FASM-Assembler Update incl. FLUG!
    Im Startpost habe ich auch die Berechnung mittels Autoit-Script angehängt.

    UEZ hat HIERübrigens einige GDI-Beispiele vorgestellt :thumbup:

  • Hallo zusammen,

    vor einigen Wochen fragte ich nach dem obrigem Thema.
    Nun hab ich nach vielen Versuchen ein erstes Ergebnis.....
    Ja, ich weiß die Apfelbrotmenge ist ein alter Hut und jeder hast schon gesehen. Zum Testen und Lernen aber eine prima Aufgabe.
    Wer es dann auch mal sehen möchte -> im Anhang (Ich hoffe das kommt auch an....)

    Nu stellt sich aber das nächste Problem:

    Zum "Pixeln" auf der GUI nutze ich momentan die "_GDIPlus_GraphicsFillRect" - Funktion. Nachteil bei der Anwendung der Funktion
    ist der Verlust der Darstellung (Bild) beim Verkleinern der GUI bzw. unter W2K verschwindet das Bild, wenn ich ein anderes Fesnter
    drüberlege (GUI im Hintergrund). Das ist natürlich nicht so prima - zum Speichern der Grafik sollte sie schon sichtbar sein.
    Bei Ubuntu hab ich von der Verwendung eines Buffers gelese (GUIPlus - Tutorial / Hier nochmals den Dank an Ubuntu - sehr hilfreich beim Einstieg).

    Nun meine Frage:
    Behebt die Verwendung eines Buffers über die Funktion "_GDIPlus_BitmapCreateFromGraphics" und "_GDIPlus_ImageGetGraphicsContext" den Verlust
    der Bildinformation und kann ich den Bildausschnitt später auch speichern ?

    Für Eure Hilfe schon mal vielen Dank

    Wenn Du's eilig hast - geh langsam...