gdiplus

  • hi,

    ich will zwei bilder neben einander unter einem Bild mit gdiplus speichern,
    also zwei 30x30pixel Bilder nebeneinander zu einem Bild mit 60x30pixel Bild speichern

    wichtig transperenz muss bleiben

    is des möglich

  • Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    _GDIPlus_Startup ()
    Opt ("GUIOnEventMode", 1)

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

    Global Const $i_WIDTH = 601, $i_HEIGHT = 201
    Global $a_Points[3][2] = [[2], [0, $i_HEIGHT / 2], [10, $i_HEIGHT / 2]]
    Global $a_GuiSize[2] = [$i_WIDTH, $i_HEIGHT], $a_GridSize[2] = [10, 10]
    Global $ah_GridPen[2] = [_GDIPlus_PenCreate (0xFF2C424D), _GDIPlus_PenCreate (0xFF50778B)]
    Global $ah_PointsPen[5] = [ _
    _GDIPlus_PenCreate (0x7F00FF00, 1), _
    _GDIPlus_PenCreate (0x3F00FF00, 3), _
    _GDIPlus_PenCreate (0x3300FF00, 5), _
    _GDIPlus_PenCreate (0x2600FF00, 7), _
    _GDIPlus_PenCreate (0x1900FF00, 9)]

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

    Global $h_Gui = GUICreate ("", $i_WIDTH, $i_HEIGHT)
    Global $h_Graphic = _GDIPlus_GraphicsCreateFromHWND ($h_Gui)
    Global $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics ($i_WIDTH, $i_HEIGHT, $h_Graphic)
    Global $h_Backbuffer = _GDIPlus_ImageGetGraphicsContext ($h_Bitmap)
    _GDIPlus_GraphicsSetSmoothingMode ($h_Backbuffer, 2)

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

    GUIRegisterMsg (0x000F, "WM_PAINT")
    GUISetOnEvent (-3, "_Exit", $h_Gui)
    OnAutoItExitRegister ("_OnExit")
    GUISetState (@SW_SHOW, $h_Gui)

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

    While Sleep (1)
    _GDIPlus_GraphicsClear ($h_Backbuffer, 0xFF000000)
    _GDIPlus_GraphicsDrawGrid ($h_Backbuffer, $a_GridSize, $a_GuiSize, $ah_GridPen) ; An diesem Punkt
    _GDIPlus_GraphicsDrawCurve ($h_Backbuffer, $a_Points, $ah_PointsPen[4]) ; wird in die Bitmap gezeichnet.
    _GDIPlus_GraphicsDrawCurve ($h_Backbuffer, $a_Points, $ah_PointsPen[3]) ; Es wird auch gleichzeitig
    _GDIPlus_GraphicsDrawCurve ($h_Backbuffer, $a_Points, $ah_PointsPen[2]) ; in der GUI angezeigt.
    _GDIPlus_GraphicsDrawCurve ($h_Backbuffer, $a_Points, $ah_PointsPen[1]) ; ~~~
    _GDIPlus_GraphicsDrawCurve ($h_Backbuffer, $a_Points, $ah_PointsPen[0]) ; ~~~
    _WinAPI_RedrawWindow ($h_Gui, 0, 0, $RDW_INTERNALPAINT)
    _SetPoint ()
    WEnd

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

    Func _SetPoint ()
    Local Static $i = 0
    If $i >= $i_WIDTH Then
    If _GDIPlus_ImageSaveToFile ($h_Bitmap, @DesktopDir & "\bitmap.bmp") Then ; Hier wird das Bild gespeichert
    MsgBox (64, "Info", "Die Bitmap wurde erfolgreich unter " & @DesktopDir & "\bitmap.bmp gespeichert.")
    Exit
    EndIf
    EndIf
    ReDim $a_Points[$a_Points[0][0] + 2][2]
    $a_Points[0][0] += 1

    If $i = 0 Then
    $a_Points[$a_Points[0][0]][0] = Random (0, 20, 1)
    $a_Points[$a_Points[0][0]][1] = Random (30, $i_HEIGHT - 30, 1)
    Else
    $a_Points[$a_Points[0][0]][0] = Random ($i, $i + 20, 1)
    $a_Points[$a_Points[0][0]][1] = Random (30, $i_HEIGHT - 30, 1)
    EndIf

    $i = $a_Points[$a_Points[0][0]][0] + 5
    EndFunc ;==> _SetPoint

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

    Func _GDIPlus_GraphicsDrawGrid ($h_Graphics, $a_GridSize, $a_GuiSize, $ah_GridPen)
    For $i_X = 0 To $a_GuiSize[0] Step $a_GridSize[0]
    For $i_Y = 0 To $a_GuiSize[1] Step $a_GridSize[1]
    _GDIPlus_GraphicsDrawLine ($h_Graphics, $i_X, 0, $i_X, $a_GuiSize[1], $ah_GridPen[0])
    _GDIPlus_GraphicsDrawLine ($h_Graphics, 0, $i_Y, $a_GuiSize[0], $i_Y, $ah_GridPen[0])
    Next
    Next

    For $i_X = 0 To $a_GuiSize[0] Step $a_GridSize[0] * 5
    For $i_Y = 0 To $a_GuiSize[1] Step $a_GridSize[1] * 5
    _GDIPlus_GraphicsDrawLine ($h_Graphics, $i_X, 0, $i_X, $a_GuiSize[1], $ah_GridPen[1])
    _GDIPlus_GraphicsDrawLine ($h_Graphics, 0, $i_Y, $a_GuiSize[0], $i_Y, $ah_GridPen[1])
    Next
    Next
    EndFunc ;==> _GDIPlus_GraphicsDrawGrid

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

    Func WM_PAINT ()
    _GDIPlus_GraphicsDrawImageRect ($h_Graphic, $h_Bitmap, 0, 0, $i_WIDTH, $i_HEIGHT)
    EndFunc ;==> WM_PAINT

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

    Func _Exit ()
    Exit
    EndFunc ;==> _Exit

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

    Func _OnExit ()
    For $i = 0 To UBound ($ah_GridPen) - 1
    _GDIPlus_PenDispose ($ah_GridPen[$i])
    Next
    For $i = 0 To UBound ($ah_PointsPen) - 1
    _GDIPlus_PenDispose ($ah_PointsPen[$i])
    Next
    _GDIPlus_GraphicsDispose ($h_Graphic)
    _GDIPlus_BitmapDispose ($h_Bitmap)
    _GDIPlus_Shutdown ()
    EndFunc ;==> _OnExit

    [/autoit]

    Das beantwortet natürlich nicht ganz die Frage, stellt aber ein Beispiel dar.

    Allgemein zeichnest du die Grafiken mit _GDIPlus_GraphicsDrawImageRect in die Bitmap
    und speicherst diese dann mit _GDIPlus_ImageSaveToFile ab.

  • ich will ja aber aus zwei kleinen bildern ein zusammengestelltes großes machen ohne gui.

    Mein Problem is ich brauch einen transparenten Graphiccontext der 60x30 ist indem ich die 2Bilder mit 30x30 rein zeichne,
    nur wo bring ich den her?

    Einmal editiert, zuletzt von AutoItfreak (10. Juni 2012 um 20:23)

  • Zitat

    nur wo bring ich den her?


    Wo wird denn in dem Programm gezeichnet? Nicht direkt in die GUI. Zuerst wird alles in eine Bitmap im Speicher gezeichnet und diese Bitmap wird danach auf die GUI gebracht. Wenn du Zeile 81 auskommentierst, siehst du nichts auf der GUI, aber wenn das Bild gespeichert wird ist der Inhalt immer noch da. Die Funktion _BitmapCreateFromGraphics erstellt eine Bitmap im Speicher in die du zeichnen kannst und die du in Dateien speichern kannst. Die Bitmap wird zwar aus der Graik der GUI generiert, aber zu den Eigenschaften die daraus übernommen werden gehört nicht die Größe. Die Bitmap kannst du (bis zu einem gewissen Limit) so groß machen wie du willst, unabhängig von der Größe der GUI. Dafür sind die ersten beiden Parameter der Funktion da.
    Also erstellst du jetzt einfach eine Bitmap die die gewünschte Größe hat und zeichnest beide Bilder an die gewünschte Position. Eine neu erstellte Bitmap ist immer transparent (jeder Pixel hat den Farbwert 0), aber wenn du die Transparenz erhalten möchtest, musst du sie in einem entsprechenden Format wie z.B. .png speichern.

  • Auch wenn ich jetzt der böse Seubo bin, der allen Alles vorkaut - hier ein eventuell leichter verdauliches Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()
    $hBitmap_Kl1 = _GDIPlus_BitmapCreateFromFile(@DesktopDir & "\kl1.png")
    $hBitmap_Kl2 = _GDIPlus_BitmapCreateFromFile(@DesktopDir & "\kl2.png")

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

    $hDesktop_DC = _WinAPI_GetDC(_WinAPI_GetDesktopWindow())
    $hWinHBITMAP = _WinAPI_CreateCompatibleBitmap($hDesktop_DC, 60, 30)
    $hBitmap_Erg = _GDIPlus_BitmapCreateFromHBITMAP($hWinHBITMAP)

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

    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap_Erg)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap_Kl1, 0, 0, 30, 30)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap_Kl2, 30, 0, 30, 30)
    _GDIPlus_ImageSaveToFile($hBitmap_Erg, @DesktopDir & '\Ergebnis.png')

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

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap_Kl1)
    _GDIPlus_BitmapDispose($hBitmap_Kl2)
    _GDIPlus_BitmapDispose($hBitmap_Erg)
    _WinAPI_DeleteObject($hWinHBITMAP)
    _WinAPI_ReleaseDC(_WinAPI_GetDesktopWindow(), $hDesktop_DC)
    _GDIPlus_Shutdown()

    [/autoit]