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
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <Color.au3>
_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)
$BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iWidth, $iHeight, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
$Scan = DllStructGetData($BitmapData, "Scan0")
$Stride = DllStructGetData($BitmapData, "Stride")
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()
_GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}")
HotKeySet("{S}", "_Save")
$hWnd = GUICreate("Farben invertiert (Speichern mit 'Shift + s')", $iWidth, $iHeight)
GUISetState()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
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
Func _Abort()
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Abort
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
Func WM_PAINT()
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndFunc ;==>WM_PAINT
ChangeLog:
Spoiler anzeigen
1.1:
-GUI
-Undo/Redo Funktionen
-Graustufen umwandler
-Schwarweiß umwandler
-Färbe Funktion