GDI+ Bitmap Effekte

  • Ein einfaches Script um Bilder zu öffnen, deren Farben zu invertieren und in einem beliebigen Format wieder zu speichern.

    Funktionsweise:
    -Bild wird mit _GDIPlus_BitmapCreateFromFile geladen und in eine Bitmap umgewandelt
    -Mit _GDIPlus_BitmapLockBits werden die Pixeldaten in einem DLLStruct gespeichert oder so ähnlich ?(
    -Danach wird die Pixelfarbe jedes einzelnen Pixels eingelesen und durch das exakte gegenstück ihrer RGB Werte ersetzt
    -Dann werden die Änderungen an den Pixeln der Bitmap mit _GDIPlus_BitmapUnLockBits übernommen
    -Das ganze wird in ein GUI gezeichnet und in beliebigem Dateiformat gespeichert.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <Color.au3>

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

    _GDIPlus_Startup()

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

    $hBitmap = _GDIPlus_BitmapCreateFromFile(FileOpenDialog("Datei auswählen", @ScriptDir, "Bilder (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 3))
    $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    $iHeight = _GDIPlus_ImageGetHeight($hBitmap)

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

    $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iWidth, $iHeight, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
    $Scan = DllStructGetData($BitmapData, "Scan0")
    $Stride = DllStructGetData($BitmapData, "Stride")

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

    HotKeySet("{ESC}", "_Abort")

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

    ProgressOn("Color Inverter (Abbrechen mit Escape)", "Fortschritt:", "Pixel werden gescannt...")
    For $iY = 0 To $iHeight - 1
    For $iX = 0 To $iWidth - 1
    $PixelData = DllStructCreate("dword", $Scan + ($iY * $Stride) + ($iX * 4))
    $Color = DllStructGetData($PixelData, 1)
    DllStructSetData($PixelData, 1, BitOR(255 - _ColorGetRed($Color), BitShift(255 - _ColorGetGreen($Color), -8), BitShift(255 - _ColorGetBlue($Color), -16)))
    Next
    ProgressSet($iY * 100 / ($iHeight - 1))
    Next
    ProgressOff()

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

    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)

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

    HotKeySet("{ESC}")
    HotKeySet("{S}", "_Save")

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

    $hWnd = GUICreate("Farben invertiert (Speichern mit 'Shift + s')", $iWidth, $iHeight)
    GUISetState()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_RESTORE
    WM_PAINT()
    EndSwitch
    WEnd

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

    Func _Abort()
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Abort

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

    Func _Save()
    $sFileDest = FileSaveDialog("Speichern unter", @ScriptDir, "Bilder (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 18)
    If @error Or $sFileDest = "" Then Return
    $sExt = StringTrimLeft($sFileDest, StringInStr($sFileDest, ".", 0, -1))
    If Not ($sExt = "jpg" Or $sExt = "jpeg" Or $sExt = "png" Or $sExt = "bmp" Or $sExt = "gif" Or $sExt = "jpg\" Or $sExt = "jpeg\" Or $sExt = "png\" Or $sExt = "bmp\" Or $sExt = "gif\") Then Return MsgBox(16, "Fehler", "Bitte gültige Dateiendung angeben")
    _GDIPlus_ImageSaveToFile($hBitmap, $sFileDest)
    EndFunc ;==>_Save

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    EndFunc ;==>WM_PAINT

    [/autoit]


    ChangeLog:

    Spoiler anzeigen

    1.1:
    -GUI
    -Undo/Redo Funktionen
    -Graustufen umwandler
    -Schwarweiß umwandler
    -Färbe Funktion

  • Also mit transparenten Bildern, will das nicht so ganz, ansonsten funktioniert es eigentlich ganz gut.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Ja nicht sehr viel lange zu machen, aber trotzdem gut
    Das habe ich mal mit BlitzBasic gemcaht, aber nicht nur Negativbild, da hatte ich viele Methoden

  • Cool! :thumbup:

    Wenn jetzt noch ein "Undo" möglich wäre, könnte man sich das Laden immer ersparen, um die Effekte auszuprobieren!

    Bei einer PNG schmiert das Skript ab!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Zitat

    Bei einer PNG schmiert das Skript ab!


    Das liegt vermutlich am Alphachannel, ich werde mich mal darum kümmern.
    Bei PNGs ohne Transparenz funktioniert alles wie gewollt.

    Edit: Das wird wohl schwieriger als ich dachte... Ich kann zwar den Alphachannel auslesen, aber weiß nicht was ich damit tun soll, bzw. können _ColorGetRed etc. damit natürlich nichts anfangen. ?(