Hi,
Ich hab einen Laserschwert Maler gemacht, und stelle ihn hier vor.
Mit ihm kann man Laserschwerter in Bilder einmalen.
Einstellbar ist bis jetzt:
-Die Farbe
-Die Breite der Klinge
-Die Breite des Scheins
-Die Transparent des Scheins
Hier ist das Skript:
Spoiler anzeigen
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
Opt("MouseCoordMode", 2)
Opt("GUICloseOnESC", 0)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $GUIEinstellungenWidth = 300
Global $GUIEinstellungenHeight = 150
Global $hPath = _GDIPlus_PathCreate(0)
Global $hCustomLineCap = _GDIPlus_CustomLineCapCreate(0, $hPath)
Global $GUIWidth = 500
Global $GUIHeight = 500
Global $hImage
Global $hImageHeight
Global $hImageWidth
Global $SchonGedrucktLinks = False
Global $SchonGedrucktRechts = False
Global $Punkt1
Global $Punkt2
Global $BladeWidth = 10
Global $BildImported = False
Global $BildTransparents = -1
Global $BreiteSchein = 2
Global $Farbe = '0000CD'
_GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, 2, 2)
$avCaps = _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)
_GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, 1, 2)
$avCapsBlade = _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)
Global $GUIEinstellungen = GUICreate("Bearbeitung", $GUIEinstellungenWidth, $GUIEinstellungenHeight, -1, 10)
Global $EinstellungenMenu = GUICtrlCreateMenu("Datei")
Global $EinstellungenMenuImport = GUICtrlCreateMenuItem("Bild importieren", $EinstellungenMenu)
Global $EinstellungenMenuExport = GUICtrlCreateMenu("Bild exportieren", $EinstellungenMenu)
Global $EinstellungenMenuExportPNG = GUICtrlCreateMenuItem("Als PNG", $EinstellungenMenuExport)
Global $EinstellungenMenuExportJPG = GUICtrlCreateMenuItem("Als JPG", $EinstellungenMenuExport)
Global $EinstellungenMenuExportBMP = GUICtrlCreateMenuItem("Als BMP", $EinstellungenMenuExport)
Global $EinstellungenMenuExit = GUICtrlCreateMenuItem("Exit", $EinstellungenMenu)
Global $HelpMenu = GUICtrlCreateMenu("Help")
Global $Label1 = GUICtrlCreateLabel("Transparents:", 10, 10, 65, 15)
Global $UpDownTransparentsInput = GUICtrlCreateInput(-$BildTransparents, 110, 7, 35, 20)
Global $UpDownTransparents = GUICtrlCreateUpdown($UpDownTransparentsInput)
GUICtrlSetLimit($UpDownTransparents, 10, 1)
Global $Label2 = GUICtrlCreateLabel("Breite des Scheins:", 10, 30, 100, 15)
Global $UpDownScheinInput = GUICtrlCreateInput($BreiteSchein, 110, 30, 35, 20)
Global $UpDownSchein = GUICtrlCreateUpdown($UpDownScheinInput)
GUICtrlSetLimit($UpDownSchein, 10, 1)
Global $Label3 = GUICtrlCreateLabel("Klingenbreite:", 10, 50, 65, 15)
Global $UpDownBladeInput = GUICtrlCreateInput($BladeWidth, 110, 50, 35, 20)
Global $UpDownBlade = GUICtrlCreateUpdown($UpDownBladeInput)
GUICtrlSetLimit($UpDownBlade, 50, 1)
Global $FarbButton = GUICtrlCreateButton("Farbe", 160, 10, 130, 60)
GUICtrlSetBkColor($FarbButton, '0x' & $Farbe)
Global $HelpMenuAbout = GUICtrlCreateMenuItem("About", $HelpMenu)
GUISetState()
Global $GUI = GUICreate("Laserschwert v1.0", $GUIWidth, $GUIHeight, -1, -1)
GUISetState()
$GDIPlusGUI = _GDIPlus_GraphicsCreateFromHWND($GUI)
$Bitmap = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $GDIPlusGUI)
$Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
_GDIPlus_GraphicsSetSmoothingMode($Buffer, 2)
If $BildImported = False Then _GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
$BrushWhite = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$PenBlack = _GDIPlus_PenCreate(0xFF000000, 1, 2)
$PenWhite = _GDIPlus_PenCreate('0x' & Hex(220, 2) & 'FFFFFF', $BladeWidth, 2)
$PenRedTransparent1 = _GDIPlus_PenCreate('0x' & Hex(50, 2) & $Farbe, $BladeWidth * 3, 2)
_GDIPlus_PenSetLineCap($PenWhite, $avCapsBlade[0], $avCapsBlade[1], 0)
_GDIPlus_PenSetLineCap($PenRedTransparent1, $avCaps[0], $avCaps[1], 0)
GUIRegisterMsg($WM_PAINT, "_WM_PAINT")
[/autoit] [autoit][/autoit] [autoit]_WM_PAINT()
[/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg(1)
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
$MsgExitQuestion = MsgBox(0 + 4, "Achtung", "Wollen Sie das Programm wirklich beenden? Alle nicht gespeicherten Daten gehen verloren!")
If $MsgExitQuestion = 6 Then _Exit()
If $MsgExitQuestion = 7 Then Sleep(0)
Case $GUI_EVENT_RESTORE
_WM_PAINT()
Case $UpDownTransparents
$InputReadTransparents = GUICtrlRead($UpDownTransparentsInput)
$BildTransparents = -$InputReadTransparents
Case $UpDownSchein
$InputReadSchein = GUICtrlRead($UpDownScheinInput)
$BreiteSchein = $InputReadSchein
Case $UpDownBlade
$InputReadBlade = GUICtrlRead($UpDownBladeInput)
$BladeWidth = $InputReadBlade
Case $FarbButton
$Farbe = StringTrimLeft(_ChooseColor(2), 2)
GUICtrlSetBkColor($FarbButton, '0x' & $Farbe)
Case $HelpMenuAbout
MsgBox(64, "About", "Dies ist ein Programm, um Laserschwerter aus ""Star Wars"" in ein Bild einzuzeichnen." & @CRLF & @CRLF & "©All Rights Reserved by Clezz.")
Case $EinstellungenMenuExportPNG
_GDIPlus_ImageSaveToFile($Bitmap, FileSaveDialog("Bild speichern", @ScriptDir, "PNG (*.png)", 16) & ".png")
Case $EinstellungenMenuExportJPG
_GDIPlus_ImageSaveToFile($Bitmap, FileSaveDialog("Bild speichern", @ScriptDir, "JPG (*.jpg)", 16) & ".jpg")
Case $EinstellungenMenuExportBMP
_GDIPlus_ImageSaveToFile($Bitmap, FileSaveDialog("Bild speichern", @ScriptDir, "BMP (*.bmp)", 16) & ".bmp")
Case $EinstellungenMenuExit
$MsgExitQuestion = MsgBox(0 + 4, "Achtung", "Wollen Sie das Programm wirklich beenden? Alle nicht gespeicherten Daten gehen verloren!")
If $MsgExitQuestion = 6 Then _Exit()
If $MsgExitQuestion = 7 Then Sleep(0)
Case $EinstellungenMenuImport
$BildPfad = FileOpenDialog("Bild öffnen", @DesktopDir, "Bilddateien (*.jpg;*.bmp;*.png)", 1 + 2)
If Not @error Then
$BildImported = True
$hImage = _GDIPlus_ImageLoadFromFile($BildPfad)
If $hImage = -1 Then
$BildImported = False
MsgBox(32, "Fehler", "Fehler beim Laden des Bildes.")
Else
$hImageHeight = _GDIPlus_ImageGetHeight($hImage)
$hImageWidth = _GDIPlus_ImageGetWidth($hImage)
If $hImageHeight = -1 Then
$BildImported = False
MsgBox(32, "Fehler", "Fehler beim Laden des Bildes.")
ElseIf $hImageWidth = -1 Then
$BildImported = False
MsgBox(32, "Fehler", "Fehler beim Laden des Bildes.")
Else
$GUIHeight = $hImageHeight
$GUIWidth = $hImageWidth
WinMove($GUI, "", @DesktopWidth / 2 - $GUIWidth / 2, @DesktopHeight / 2 - $GUIHeight / 2, $GUIWidth, $GUIHeight, 2)
$GDIPlusGUI = _GDIPlus_GraphicsCreateFromHWND($GUI)
$Bitmap = _GDIPlus_BitmapCreateFromGraphics($hImageWidth, $hImageHeight, $GDIPlusGUI)
$Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GraphicsDrawImageRect()
_WM_PAINT()
EndIf
EndIf
EndIf
EndSwitch
If _IsPressed("01") And $SchonGedrucktRechts = False Then
$SchonGedrucktLinks = True
$Punkt1 = MouseGetPos()
If $BildImported = False Then _GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
If $BildImported = True Then
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GraphicsDrawImageRect()
EndIf
_GDIPlus_GraphicsFillRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $PenBlack)
_WM_PAINT()
EndIf
If _IsPressed("01") And $SchonGedrucktRechts = True Then
$SchonGedrucktLinks = True
$Punkt1 = MouseGetPos()
_GDIPlus_GraphicsFillRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $PenBlack)
_GDIPlus_GraphicsFillRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $PenBlack)
If $BildImported = False Then _GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
If $BildImported = True Then
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GraphicsDrawImageRect()
EndIf
For $i = 20 To 0 Step $BildTransparents
_GDIPlus_PenDispose($PenRedTransparent1)
$PenRedTransparent1 = _GDIPlus_PenCreate('0x' & Hex($i, 2) & $Farbe, $i * $BreiteSchein, 2)
_GDIPlus_PenSetLineCap($PenRedTransparent1, $avCaps[0], $avCaps[1], 0)
_GDIPlus_GraphicsDrawLine($Buffer, $Punkt1[0], $Punkt1[1], $Punkt2[0], $Punkt2[1], $PenRedTransparent1)
Next
$PenWhite = _GDIPlus_PenCreate('0x' & Hex(250, 2) & 'FFFFFF', $BladeWidth, 2)
_GDIPlus_PenSetLineCap($PenWhite, $avCapsBlade[0], $avCapsBlade[1], 0)
_GDIPlus_GraphicsDrawLine($Buffer, $Punkt1[0], $Punkt1[1], $Punkt2[0], $Punkt2[1], $PenWhite)
_GDIPlus_GraphicsSetSmoothingMode($Buffer, 2)
_WM_PAINT()
EndIf
If _IsPressed("02") And $SchonGedrucktLinks = False Then
$SchonGedrucktRechts = True
$Punkt2 = MouseGetPos()
If $BildImported = False Then _GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
If $BildImported = True Then
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GraphicsDrawImageRect()
EndIf
_GDIPlus_GraphicsFillRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $PenBlack)
_WM_PAINT()
EndIf
If _IsPressed("02") And $SchonGedrucktLinks = True Then
$SchonGedrucktRechts = True
$Punkt2 = MouseGetPos()
_GDIPlus_GraphicsFillRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $PenBlack)
_GDIPlus_GraphicsFillRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $BrushWhite)
_GDIPlus_GraphicsDrawRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $PenBlack)
If $BildImported = False Then _GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
If $BildImported = True Then
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GraphicsDrawImageRect()
EndIf
For $i = 20 To 0 Step $BildTransparents
_GDIPlus_PenDispose($PenRedTransparent1)
$PenRedTransparent1 = _GDIPlus_PenCreate('0x' & Hex($i, 2) & $Farbe, $i * $BreiteSchein, 2)
_GDIPlus_PenSetLineCap($PenRedTransparent1, $avCaps[0], $avCaps[1], 0)
_GDIPlus_GraphicsDrawLine($Buffer, $Punkt1[0], $Punkt1[1], $Punkt2[0], $Punkt2[1], $PenRedTransparent1)
Next
$PenWhite = _GDIPlus_PenCreate('0x' & Hex(250, 2) & 'FFFFFF', $BladeWidth, 2)
_GDIPlus_PenSetLineCap($PenWhite, $avCapsBlade[0], $avCapsBlade[1], 0)
_GDIPlus_GraphicsDrawLine($Buffer, $Punkt1[0], $Punkt1[1], $Punkt2[0], $Punkt2[1], $PenWhite)
_GDIPlus_GraphicsSetSmoothingMode($Buffer, 2)
_WM_PAINT()
EndIf
WEnd
Func _Exit()
_GDIPlus_CustomLineCapDispose($hCustomLineCap)
_GDIPlus_PathDispose($hPath)
_GDIPlus_PenDispose($PenWhite)
_GDIPlus_PenDispose($PenBlack)
_GDIPlus_BrushDispose($BrushWhite)
_GDIPlus_GraphicsDispose($Buffer)
_GDIPlus_BitmapDispose($Bitmap)
_GDIPlus_GraphicsDispose($GDIPlusGUI)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Exit
Func _GraphicsDrawImageRect()
_GDIPlus_GraphicsDrawImageRect($Buffer, $hImage, 0, 0, $hImageWidth, $hImageHeight)
EndFunc ;==>_GraphicsDrawImageRect
Func _WM_PAINT()
If $BildImported = False Then _GDIPlus_GraphicsDrawImageRect($GDIPlusGUI, $Bitmap, 0, 0, $GUIWidth, $GUIHeight)
If $BildImported = True Then _GDIPlus_GraphicsDrawImageRect($GDIPlusGUI, $Bitmap, 0, 0, $hImageWidth, $hImageHeight)
EndFunc ;==>_WM_PAINT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Folgende Funktionen sind aus der GDIP.au3 kopiert:;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _GDIPlus_CustomLineCapCreate($hPathFill, $hPathStroke, $iLineCap = 0, $nBaseInset = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateCustomLineCap", "hwnd", $hPathFill, "hwnd", $hPathStroke, "int", $iLineCap, "float", $nBaseInset, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
$GDIP_STATUS = $aResult[0]
Return $aResult[5]
EndFunc ;==>_GDIPlus_CustomLineCapCreate
Func _GDIPlus_PathCreate($iFillMode = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", $iFillMode, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
$GDIP_STATUS = $aResult[0]
Return $aResult[2]
EndFunc ;==>_GDIPlus_PathCreate
Func _GDIPlus_PathDispose($hPath)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_PathDispose
Func _GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, $iStartCap, $iEndCap)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetCustomLineCapStrokeCaps", "hwnd", $hCustomLineCap, "int", $iStartCap, "int", $iEndCap)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_CustomLineCapSetStrokeCaps
Func _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)
Local $aCaps[2], $aResult
$aResult = DllCall($ghGDIPDll, "uint", "GdipGetCustomLineCapStrokeCaps", "hwnd", $hCustomLineCap, "int*", 0, "int*", 0)
If @error Then Return SetError(@error, @extended, -1)
$GDIP_STATUS = $aResult[0]
If $GDIP_STATUS Then Return -1
$aCaps[0] = $aResult[2]
$aCaps[1] = $aResult[3]
Return $aCaps
EndFunc ;==>_GDIPlus_CustomLineCapGetStrokeCaps
Func _GDIPlus_PenSetLineCap($hPen, $iStartCap, $iEndCap, $iDashCap)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetPenLineCap197819", "hwnd", $hPen, "int", $iStartCap, "int", $iEndCap, "int", $iDashCap)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_PenSetLineCap
Und noch einige Bilder, allerdings habe ich bei den Beispielbildern auf einen weißen Untergrund gezeichnet:
autoit.de/wcf/attachment/9051/autoit.de/wcf/attachment/9052/autoit.de/wcf/attachment/9053/autoit.de/wcf/attachment/9054/autoit.de/wcf/attachment/9055/
//Edit: Bitte Feedback geben. Danke
Achja, Hab ich vergessen zu sagen: Für den ersten Punkt macht man einen Linksklick, und für den zweiten Punkt einen Rechtsklick, dann erscheint das Lichtschwert.