Einzelne Pixel in Datei speichern und Farbe des Einzelnen wieder Einlesen

  • Hallo
    Ich möchte ein Paar Pixel hintereinander in eine Datei schreiben (Alle mit unterschiedlicher Farbe) und danach Einzeln wieder Einlesen und schauen ob die Fraben die gleichen sind

    Also so:

    Spoiler anzeigen
    [autoit]


    $Pixel1 = 0xFF0000
    $Pixel2 = 0x00FF00
    $Pixel3 = 0x0000FF

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

    ; Dann speichern ich denke mal mit GDI+ (_GDIPlus_ImageSaveToFile)
    ; Lesen ...
    ; Dann prüfen:
    If $NewPixel1 = 0xFF0000 Then Msgbox(0, "", "Die Farbe vom 1. Pixel hat sich nicht verändert!")
    If $NewPixel2 = 0x00FF00 Then Msgbox(0, "", "Die Farbe vom 2. Pixel hat sich nicht verändert!")
    If $NewPixel3 = 0x0000FF Then Msgbox(0, "", "Die Farbe vom 3. Pixel hat sich nicht verändert!")

    [/autoit]

    Ist das machbar?

  • Die Hauptfragen:
    - Wie kann ich einzelne Pixel eines Bildes färben?
    - Wie kann ich die Farbe jedes einzelnen Pixel herausfinden?

    Pixel 1 soll in der Farbe Rot gemalt werden
    Pixel 2 soll in der Farbe Grün gemalt werden
    Pixel 3 soll in der Farbe Blau gemalt werden

    Diese Pixel werden dann zusammen in einer Bitmap Datei gespeichert

    Dann wird das Bitmap wieder eingelesen

    Jetzt möchte ich die Farbe von Pixel 1 herausfinden und wenn die Frabe gleich der Farbe Rot ist dann soll eine MSGBox erscheinen ("Gleiche Farbe: Rot")

    Ist es jetzt verständlicher?

  • Ich hab nochmal geguggt also Pixelfarbe einlesen könnte ich mit

    [autoit]

    PixelGetColor ( x , y [, hwnd] )

    [/autoit]

    aber wie kann ich einen einzelnen Pixel in eine Bitmap zeichnen wenn ich einen Polygon zeichne macht er immer 2 Pixel und nicht einen

  • Ich würde garnicht erst den Pixel als solchen speichern, sondern einfach den Farbwert z.B. in eine ini-Datei schreiben.
    Später kannst du ja dann

    [autoit]

    If Iniread() = 0xFF0000 Then MsgBox()

    [/autoit]
  • Schau dir die GDI Funktionen an. Da kannst du auch Rechtecke Zeichnen. Das wird das Problem nicht sein, aber was viel schwerer wird ist das einlesen.
    Also willst du aus der Bitmap die du erstellt hast einen Pixel von einer bestimmten Position auslesen oder wie?

  • ja genau,
    hab mir gedacht dass ich das Bitmap dann in ein Picture Control mach und dann mit PixelGetColor die Farbe ermittel.

    Es entsteht aber ein Problem, wenn die Bitmap größer ist als der Bildschirm oder als das Picture Control.
    Kann man nicht direkt von einer Bitmap nur diesen einen Pixel einlesen?

    • Offizieller Beitrag

    Hi,

    wie ist das?

    Spoiler anzeigen
    [autoit]

    Opt('WinTitleMatchMode', 4)

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

    Run('notepad')

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

    Sleep(1000)
    Global $handle = WinGetHandle('[CLASS:Notepad]')
    WinMove($handle, '', 300, 300, 500, 500, 1)

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

    Global $colors_A = _getPixelColors(50, 50, 200, 200)
    _paintPixel($colors_A, $handle, 50, 50)

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

    Func _getPixelColors($start_X = 0, $start_Y = 0, $end_X = @DesktopWidth, $end_Y = @DesktopHeight)
    Local $coord[$end_X - $start_X][$end_Y - $start_Y]
    For $x = 0 To UBound($coord, 1) - 1
    For $y = 0 To UBound($coord, 2) - 1
    $coord[$x][$y] = PixelGetColor($x + $start_X, $y + $start_Y)
    Next
    Next
    Return $coord
    EndFunc ;==>_getPixelColors

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

    Func _paintPixel(ByRef $coord, $handle, $start_X = 0, $start_Y = 0)
    Local $dc
    For $x = 0 To UBound($coord, 1) - 1
    For $y = 0 To UBound($coord, 2) - 1
    $dc = DllCall("user32.dll", "int", "GetDC", "hwnd", $handle)
    DllCall("gdi32.dll", "long", "SetPixel", "long", $dc[0], "long", $x + $start_X, "long", $y + $start_Y, "long", $coord[$x][$y])
    DllCall("user32.dll", "int", "ReleaseDC", "hwnd", 0, "int", $dc[0])
    Next
    Next
    Return $coord
    EndFunc ;==>_paintPixel

    [/autoit]

    Mega