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
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
#NoTrayIcon
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup ()
Opt ("GUIOnEventMode", 1)
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)]
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)
GUIRegisterMsg (0x000F, "WM_PAINT")
GUISetOnEvent (-3, "_Exit", $h_Gui)
OnAutoItExitRegister ("_OnExit")
GUISetState (@SW_SHOW, $h_Gui)
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
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
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
Func WM_PAINT ()
_GDIPlus_GraphicsDrawImageRect ($h_Graphic, $h_Bitmap, 0, 0, $i_WIDTH, $i_HEIGHT)
EndFunc ;==> WM_PAINT
Func _Exit ()
Exit
EndFunc ;==> _Exit
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
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?
Zitatnur 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:
#include <GDIPlus.au3>
_GDIPlus_Startup()
$hBitmap_Kl1 = _GDIPlus_BitmapCreateFromFile(@DesktopDir & "\kl1.png")
$hBitmap_Kl2 = _GDIPlus_BitmapCreateFromFile(@DesktopDir & "\kl2.png")
$hDesktop_DC = _WinAPI_GetDC(_WinAPI_GetDesktopWindow())
$hWinHBITMAP = _WinAPI_CreateCompatibleBitmap($hDesktop_DC, 60, 30)
$hBitmap_Erg = _GDIPlus_BitmapCreateFromHBITMAP($hWinHBITMAP)
$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')
_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()
SEuBo Du böser du! Wieso böse? Ich hätte nur keine Lust gehabt ein Beispiel zu schreiben, sonst hätte ich das auch gemacht ^^.