GDI+: Star Wars: Laserschwert Maler

  • 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
    [autoit]


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

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

    Opt("MouseCoordMode", 2)
    Opt("GUICloseOnESC", 0)

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

    _GDIPlus_Startup()

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

    Global $GUIEinstellungenWidth = 300
    Global $GUIEinstellungenHeight = 150

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

    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'

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

    _GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, 2, 2)
    $avCaps = _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)
    _GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, 1, 2)
    $avCapsBlade = _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)

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

    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()

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

    Global $GUI = GUICreate("Laserschwert v1.0", $GUIWidth, $GUIHeight, -1, -1)
    GUISetState()

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

    $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)

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

    _GDIPlus_PenSetLineCap($PenWhite, $avCapsBlade[0], $avCapsBlade[1], 0)
    _GDIPlus_PenSetLineCap($PenRedTransparent1, $avCaps[0], $avCaps[1], 0)

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

    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)

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

    _GDIPlus_GraphicsFillRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $BrushWhite)
    _GDIPlus_GraphicsDrawRect($Buffer, $Punkt1[0], $Punkt1[1], 5, 5, $PenBlack)

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

    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

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

    $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)

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

    _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)

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

    _GDIPlus_GraphicsFillRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $BrushWhite)
    _GDIPlus_GraphicsDrawRect($Buffer, $Punkt2[0], $Punkt2[1], 5, 5, $PenBlack)

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

    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

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

    $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)

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

    _WM_PAINT()
    EndIf
    WEnd

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

    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

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

    Func _GraphicsDrawImageRect()
    _GDIPlus_GraphicsDrawImageRect($Buffer, $hImage, 0, 0, $hImageWidth, $hImageHeight)
    EndFunc ;==>_GraphicsDrawImageRect

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

    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

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;Folgende Funktionen sind aus der GDIP.au3 kopiert:;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    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)

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

    If @error Then Return SetError(@error, @extended, 0)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[5]
    EndFunc ;==>_GDIPlus_CustomLineCapCreate

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

    Func _GDIPlus_PathCreate($iFillMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", $iFillMode, "int*", 0)

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

    If @error Then Return SetError(@error, @extended, 0)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[2]
    EndFunc ;==>_GDIPlus_PathCreate

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

    Func _GDIPlus_PathDispose($hPath)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)

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

    If @error Then Return SetError(@error, @extended, False)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_PathDispose

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

    Func _GDIPlus_CustomLineCapSetStrokeCaps($hCustomLineCap, $iStartCap, $iEndCap)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetCustomLineCapStrokeCaps", "hwnd", $hCustomLineCap, "int", $iStartCap, "int", $iEndCap)

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

    If @error Then Return SetError(@error, @extended, False)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_CustomLineCapSetStrokeCaps

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

    Func _GDIPlus_CustomLineCapGetStrokeCaps($hCustomLineCap)
    Local $aCaps[2], $aResult

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetCustomLineCapStrokeCaps", "hwnd", $hCustomLineCap, "int*", 0, "int*", 0)
    If @error Then Return SetError(@error, @extended, -1)

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

    $GDIP_STATUS = $aResult[0]
    If $GDIP_STATUS Then Return -1
    $aCaps[0] = $aResult[2]
    $aCaps[1] = $aResult[3]
    Return $aCaps
    EndFunc ;==>_GDIPlus_CustomLineCapGetStrokeCaps

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

    Func _GDIPlus_PenSetLineCap($hPen, $iStartCap, $iEndCap, $iDashCap)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetPenLineCap197819", "hwnd", $hPen, "int", $iStartCap, "int", $iEndCap, "int", $iDashCap)

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

    If @error Then Return SetError(@error, @extended, False)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_PenSetLineCap

    [/autoit]

    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 :thumbup:
    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.

  • 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.

  • Wäre gut für Button Designs

    Wie meinst du des? Sollen da Laserschwerter auf die Buttons, oder wie? :D (sry, wenn es offentsichtlich ist, und ich es nicht kapier)

  • Super Skript, allerdings heißt es Transparenz.

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • sorry wühle jetzt einfach mal alle threads durch...

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!