Beiträge von Peri Petie
-
-
Hallo bollen,
in deinem Script bewegt sich das komplette Bild nicht dynamisch mit der Maus.Wenn ich mich recht entsinne, hattest du in deinem ersten Beitrag, den du leider gelöscht hast, trotzdem nicht ganz unrecht.
Mit dem $hContext hatte ich wohl einen falschen Bezug hergestellt.
Inzwischen habe ich eine zusätzliche Funktion "_GDIPlus_BitmapCreateFromScan0" eingefügt und den $hContext darauf bezogen.
Nun funktioniert es.AutoIt
Alles anzeigen#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <GDIP.au3> #include <Misc.au3> Opt('MouseCoordMode', 2) Global $msg Global $img, $hImage Global $width = 600, $height = 600 Global $iWidth, $iHeight Global $hWnd = GUICreate("", 600, 647) Global $brush = GUICtrlCreateButton("Brush", 100, 616, 57, 25, $WS_GROUP) Global $pen = GUICtrlCreateButton("Pen", 200, 616, 65, 25, $WS_GROUP) Global $quit = GUICtrlCreateButton("Beenden", 500, 616, 57, 25, $WS_GROUP) GUISetState(@SW_SHOW) _GDIPlus_Startup() Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd) Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphics) Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) Global $hPen = _GDIPlus_PenCreate(0xFFFFFFF, 3) AdlibRegister("_newCoords", 10) While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE _Exit() Case $quit _Exit() Case $brush _SetBrush() Case $pen ;_SetPen() EndSwitch WEnd Func _SetBrush() Local $img1 = FileOpenDialog("Bild auswählen", "", "Bilder (*.jpg;*.png;*.bmp;*.tif)") $img = _GDIPlus_ImageLoadFromFile($img1) Local $iX = _GDIPlus_ImageGetWidth ($img) Local $iY = _GDIPlus_ImageGetHeight ($img) $iWidth = $iX $iHeight = $iY $hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight) Local $hBrush = _GDIPlus_TextureCreate2($img, 0, 0, $iX, $iY, 0) Local $hContext = _GDIPlus_ImageGetGraphicsContext($hImage) _GDIPlus_GraphicsFillEllipse($hContext, 0, 0, $iX, $iY, $hBrush) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hContext) EndFunc Func _newCoords() Local $mpos = GUIGetCursorInfo() If IsArray($mpos) Then If $mpos[2] = 1 Then Sleep(100) _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, $mpos[0], $mpos[1], 80, 40) ;hier kann die Groesse der Ellipse geändert werden _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $width, $height) EndIf EndIf EndFunc Func _Exit() AdlibUnRegister("_newCoords") _GDIPlus_PenDispose($hPen) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_ImageDispose($hBackbuffer) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_ImageDispose($img) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() Exit EndFunc
-
Würde ich auf den Backbuffer malen, hätte ich wieder das Problem mit der statischen Textur, die ich ja nicht als Brush haben möchte.
Es geht mir nur um die Form des Brushes, nicht den Inhalt. Der ist so, wie ich ihn auch haben will.
Die Form des Brushes soll nicht rechteckig, sondern ellipsen- bzw. kreisförmig sein. -
Erstmal ein dickes Hallo an alle.
Ich wende mich nun an euch, weil ich irgendwie ziemlich auf dem Schlauch stehe, und zwar mit allen vieren.
Habe erfolgreich einen Brush mit einem Bild gefüllt, schaffe es aber nicht, dem Brush eine Ellipsen- bzw. Kreisform zu verpassen.
Was mache ich falsch?AutoIt
Alles anzeigen#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <GDIP.au3> #include <Misc.au3> Opt('MouseCoordMode', 2) Global $dll = DllOpen('user32.dll') Global $msg Global $img Global $width = 600, $height = 600 Global $hWnd = GUICreate("", 600, 647) Global $brush = GUICtrlCreateButton("Brush", 100, 616, 57, 25, $WS_GROUP) Global $pen = GUICtrlCreateButton("Pen", 200, 616, 65, 25, $WS_GROUP) Global $quit = GUICtrlCreateButton("Beenden", 500, 616, 57, 25, $WS_GROUP) GUISetState(@SW_SHOW) _GDIPlus_Startup() Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd) Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphics) Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) Global $hPen = _GDIPlus_PenCreate(0xFFFFFFF, 3) AdlibRegister("_newCoords", 10) While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE _Exit() Case $quit _Exit() Case $brush _SetBrush() Case $pen ;_SetPen() EndSwitch WEnd Func _SetBrush() Local $img1 = FileOpenDialog("Bild auswählen", "", "Bilder (*.jpg;*.png;*.bmp;*.tif)") $img = _GDIPlus_ImageLoadFromFile($img1) Local $iX = _GDIPlus_ImageGetWidth ($img) Local $iY = _GDIPlus_ImageGetHeight ($img) Local $hBrush = _GDIPlus_TextureCreate2($img, 0, 0, $iX, $iY, 0) Local $hContext = _GDIPlus_ImageGetGraphicsContext($img) _GDIPlus_GraphicsFillEllipse($hContext, 0, 0, $iX, $iY, $hBrush) _GDIPlus_BrushDispose($hBrush) EndFunc Func _newCoords() Local $mpos = GUIGetCursorInfo() If IsArray($mpos) Then If $mpos[2] = 1 Then Sleep(50) _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $img, $mpos[0], $mpos[1], 50, 50) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $width, $height) EndIf EndIf EndFunc Func _Exit() AdlibUnRegister("_newCoords") _GDIPlus_PenDispose($hPen) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_ImageDispose($hBackbuffer) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_ImageDispose($img) _GDIPlus_Shutdown() Exit EndFunc
-
Hey, "_GDIPlus_ImageResize" kannte ich überhaupt noch nicht; werde ich mir aber anschauen.
Vielleicht ist es mit dieser Funktion etwas simpler. Vielen Dank für den Tipp.
Zwischenzeitlich hatte ich aber weiter gebastelt und es tatsächlich hinbekommen.
Nachfolgend das Script von Dir aus dem ersten Posting, erweitert um Skalierung und Speicherung des neuen Bildes:C
Alles anzeigen#include <GDIPlus.au3> #include <GUIConstants.au3> $iGUIWidth = 400 $iGUIHeight = 400 $GUIColorBG = 0xFFFFFFFF $iX = 50 ;X-Koordinate des rechteckigen Bitmap Ausschnitts $iY = 50 ;Y-Koordinate des rechteckigen Bitmap Ausschnitts $iX2 = 100 ;X-Koordinate der Ellipse $iY2 = 100 ;Y-Koordinate der Ellipse $iWidth = 50 ;Breite des rechteckigen Bitmap Ausschnitts $iHeight = 50 ;Höhe des rechteckigen Bitmap Ausschnitts $iWidth2 = 50 ;Breite der Ellipse $iHeight2 = 50 ;Höhe der Ellipse $NewW = 200 $NewH = 200 $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight) GUISetState() _GDIPlus_Startup() $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd) $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic) $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsClear($hGraphic, $GUIColorBG) _GDIPlus_GraphicsClear($hBuffer, $GUIColorBG) $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Test.png") $hTextureBrush = _GDIPlus_TextureCreate2($hImage, $iX, $iY, $iWidth, $iHeight) _GDIPlus_GraphicsFillEllipse($hBuffer, $iX2, $iY2, $iWidth2, $iHeight2, $hTextureBrush) _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight) $hBitMap_Neu = _GDIPlus_BitmapCreateFromGraphics($NewW, $NewH, $hBuffer) _GDIPlus_GraphicsDispose($hBuffer) $hGraphics_Neu = _GDIPlus_ImageGetGraphicsContext($hBitMap_Neu) _GDIPlus_GraphicsDrawImageRect($hGraphics_Neu, $hBitmap, 0, 0, $NewW, $NewH) _GDIPlus_GraphicsDispose($hGraphics_Neu) _GDIPlus_ImageSaveToFile($hBitmap_Neu, @ScriptDir & "\Test_Neu.png") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_GraphicsDispose($hBuffer) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_ImageDispose($hImage) _GDIPlus_BrushDispose($hTextureBrush) _GDIPlus_Shutdown() Exit EndSwitch WEnd ;Die Funktionen sind nicht von mir!! ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_TextureCreate ; Description ...: Creates a TextureBrush object based on an image and a wrap mode ; Syntax.........: _GDIPlus_TextureCreate($hImage[, $iWrapMode = 0]) ; Parameters ....: $hImage - Pointer to an Image object ; $iWrapMode - Wrap mode that specifies how repeated copies of an image are used to tile an area when it is ; +painted with the texture brush: ; |0 - Tiling without flipping ; |1 - Tiles are flipped horizontally as you move from one tile to the next in a row ; |2 - Tiles are flipped vertically as you move from one tile to the next in a column ; |3 - Tiles are flipped horizontally as you move along a row and flipped vertically as you move along a column ; |4 - No tiling takes place ; Return values .: Success - Pointer to a new TextureBrush object ; Failure - 0 and either: ; |@error and @extended are set if DllCall failed ; |$GDIP_STATUS contains a non zero value specifying the error code ; Remarks .......: The size of the brush defaults to the size of the image, so the entire image is used by the brush ; After you are done with the object, call _GDIPlus_BrushDispose to release the object resources ; Related .......: _GDIPlus_BrushDispose ; Link ..........; @@MsdnLink@@ GdipCreateTexture ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_TextureCreate($hImage, $iWrapMode = 0) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateTexture", "hwnd", $hImage, "int", $iWrapMode, "int*", 0) If @error Then Return SetError(@error, @extended, 0) $GDIP_STATUS = $aResult[0] Return $aResult[3] EndFunc ;==>_GDIPlus_TextureCreate ; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_TextureCreate2 ; Description ...: Creates a TextureBrush object based on an image, a wrap mode and a defining rectangle ; Syntax.........: _GDIPlus_TextureCreate2($hImage, $nX, $nY, $nWidth, $nHeight[, $iWrapMode = 0]) ; Parameters ....: $hImage - Pointer to an Image object ; $nX - Leftmost coordinate of the image portion to be used by this brush ; $nY - Uppermost coordinate of the image portion to be used by this brush ; $nWidth - Width of the brush and width of the image portion to be used by the brush ; $nHeight - Height of the brush and height of the image portion to be used by the brush ; $iWrapMode - Wrap mode that specifies how repeated copies of an image are used to tile an area when it is ; +painted with the texture brush: ; |0 - Tiling without flipping ; |1 - Tiles are flipped horizontally as you move from one tile to the next in a row ; |2 - Tiles are flipped vertically as you move from one tile to the next in a column ; |3 - Tiles are flipped horizontally as you move along a row and flipped vertically as you move along a column ; |4 - No tiling takes place ; Return values .: Success - Pointer to a new TextureBrush object ; Failure - 0 and either: ; |@error and @extended are set if DllCall failed ; |$GDIP_STATUS contains a non zero value specifying the error code ; Remarks .......: After you are done with the object, call _GDIPlus_BrushDispose to release the object resources ; Related .......: _GDIPlus_BrushDispose ; Link ..........; @@MsdnLink@@ GdipCreateTexture2 ; Example .......; No ; =============================================================================================================================== Func _GDIPlus_TextureCreate2($hImage, $nX, $nY, $nWidth, $nHeight, $iWrapMode = 0) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateTexture2", "hwnd", $hImage, "int", $iWrapMode, "float", $nX, "float", $nY, "float", $nWidth, "float", $nHeight, "int*", 0) If @error Then Return SetError(@error, @extended, 0) $GDIP_STATUS = $aResult[0] Return $aResult[7] EndFunc ;==>_GDIPlus_TextureCreate2
-
Hi name22,
ich stehe mal wieder völlig auf dem Schlauch:
Wie kann ich bei Deinem Beispielscript mittels "_GDIPlus_GraphicsDrawImageRectRect" das Bild verkleinern und auch abspeichern? Das verkleinerte Bild bekomme ich in die Gui; aber ich bekomme es nicht abgespeichert.
Nachdem ich hin und her probiert habe, bin ich endgültig verwirrt.
Kannst Du mir da auf die Sprünge helfen?
Vielen Dank schon mal vorab. -
Habe mich nun eigenmächtig dazu entschlossen, dass Thema als gelöst zu markieren, auch wenn die eigentliche Frage nicht beantwortet wurde, das Problem aber anderweitig gelöst werden konnte.
Meine Anwendung läuft bereits seit einiger Zeit ohne Flackern und ohne "schwarze Löcher".
@ name22:
Höre und staune: Kernstück der Anwendung ist "_GDIPlus_TextureCreate2"
Danke. -
So falsch war das gar nicht. Ausserdem sollte ich mir meine eigenen Beiträge mal genauer durchlesen, dann hätte sich mein Problem mit dem Dreieck gleich erledigt.
Bin nämlich zwischenzeitlich zu folgender Erkenntnis gelangt:Legt man mehrere Skatkarten im Halbkreis angordnet übereinander (so, wie man sie während eines Spiels üblicherweise auch in der Hand hält), ergibt sich bei jeder unter einer anderen liegenden Karte automatisch ein Dreieck, na ja, ok, zumindest annähernd.
Ergo: ich muss die Karte nicht erst zerschnippeln, um einen dreieckigen Ausschnit zu erhalten. Der Rotationswinkel des darüberliegenden Rechtecks ist entscheidend.Bei meiner Anwendung geht es zwar nicht um Spielkarten, aber die Anordnung der Bilder ist teilweise ähnlich.
Kannst Du nicht nicht wissen. Ich bitte auch um Nachsicht wegen "nicht eindeutig", dafür habe ich aber meine Gründe.
Ich werde mich aber bemühen, soweit es geht, meine Fragen so konkret zu stellen, wie es möglich ist.Ausserdem ist meine Frage nach der Referenzierung eines einzelnen Tortenstücks anscheinend im Nirvana angelangt. Konkreter geht es doch wohl nicht.
So, und nun noch ein schönes Wochenende, auch an alle anderen Cracks hier im Forum.
-
"Jetzt bin ich echt nur noch verwirrt"
Das war nun wirklich nicht meine Absicht, zumal Du mir einen neuen Lösungsansatz aufgezeigt hast. Denn inzwischen habe ich mich endgültig von meiner Idee mit der Kuchenform verabschiedet, da sich hierbei doch immer wieder Bereiche überlappen, wo es störend ist. Habe mich nun doch entschlossen,
mir die Dreiecke mit Polygonen selbst zu erstellen. Ist zwar mehr Arbeit (die Dreieckserstellung mit der „Pie-Funktion“ war so angenehm simpel ), aber geometrische Berechnungen kriege ich schon hin. Ausserdem denke ich, dass ich damit später in meiner geplanten Anwendung wesentlich flexibler bin.Mit den TexturCreate-Funktionen habe ich zwischenzeitlich auch ein wenig rumgespielt. Im Grunde passen sie ja genau in die Schublade, in der ich gerade „wühle“.
Was mich anfangs abgeschreckt hatte, war, dass sie lediglich vertikal und horizontal anzuwenden sind und nicht diagonal. Das hiesse also, dass ich mein Bild erst drehen müsste, um einen „schrägen“ Bildausschnitt zu erhalten. Aber mit Matrixfunktionen habe ich ein wenig Erfahrung und sollte kein grosses Problem sein. Ausserdem habe ich in der GDIP.au3 auch die Funktionen TextureScale- und TextureRotate-Transform entdeckt. Muss ich aber noch ausprobieren.
Also, trotz Verwirrung habe ich durch Deine Tipps einen neuen Weg nach Rom gefunden.
Mal sehen, ob ich auch in Rom ankomme. -
Bei einer Tasse Kaffee habe ich mein Konzept noch einmal überdacht und festgestellt, dass ich für weitere Operationen meines Programms den gesamten "Kuchen" benötige. Das zwischenzeitliche Separieren eines einzelnen Pies ist für mein Vorhaben unsinnig und hat sich somit erledigt.
Meine grundsätzliche Frage, ob man mit einem einzelnen Pie als eigenständiges Objekt weiterarbeiten kann, bleibt allerdings leider unbeantwortet.
Das muss auch anders funktionieren, als es erst in ein Objekt mit Textur umwandeln zu müssen.
Eine Möglichkeit wäre vielleicht, die Grösse des angrenzenden Rechtecks zu ermitteln, in dem sich das Pie befindet, um dieses dann per "BitmapCloneArea" vom Kuchen abzuspalten. Halte ich auch für einen Umweg, aber wesentlich kürzer als Dein Ansatz.
Aber egal, ich brauch's ja nun nicht mehr.Dennoch vielen Dank nochmals für Deine Mühe, name22.
-
"Du kannst einfach weiterhin _GDIPlus_GraphicsFillPie nutzen, nur
zeichnest du den Ausschnitt der übrig bleibt, statt alles zu zeichnen
und dann zu übermalen."???
Wenn ich "_GDIPlus_GraphicsFillPie" anwende, dann zeichne ich doch die gesamte Torte und nicht "nur den Ausschnitt, der übrig bleibt".
Auch wenn ich den grössten Teil transparent male, so ist er immer noch vorhanden und ich muss ihn immer wieder mitzeichnen, das wollte ich ja vermeiden.Es gibt also keine Möglichkeit, in Bezug auf mein Script, ein einzelnes Pie, das sichtbar auf meiner Arbeitsfläche plaziert ist, als Bitmap-, Graphics-, Image- oder sonstiges Objekt neu zu deklarieren, um damit weiterarbeiten zu können?
-
Wurde "gezwungen", erstmal Middach zu machen.
So, und nun aber gestärkt in den Kampf.Wozu ein Polygon erstellen? Meinst Du das in Bezug auf Deine Funktion?
Also, bevor wir aneinander vorbeireden, noch einmal meine Frage:
Wie kann ich, bezugnehmend auf mein Script, das sichtbare Tortenstück kopieren und neben, über oder unter (egal) das bereits sichtbare Tortenstück plazieren (sorry, alte Rechtschreibung), ohne die gesamte Torte mittels der Funktion "_GDIPlus_GraphicsFillPie" zeichnen zu müssen? -
Hi name22,
vielen Dank für Deine Hilfe. Das ist eine geile Funktion, die mir beim Stöbern im Forum schon aufgefallen ist.
Leider kann ich sie für meinen Zweck nicht wirklich nutzen.Mir kommt es wirklich darauf an, mit dem aus der Funktion "_GDIPlus_GraphicsFillPie" freigestellten Tortenstück als separates Objekt weiterzuarbeiten, zumal ich hiermit auch die Möglichkeit habe, "schiefwinklige" Ausschnitte aus einem Bild erstellen zu können.
Trotzdem noch einmal vielen Dank.
-
Hi,
ich stehe mal wieder im Wald und hoffe darauf, dass ihr nach dem gestrigen Trubel wieder nüchtern genug seid, um mir helfen zu können.
Nachstehendes Script bewirkt nach dem Laden eines Bildes (idealerweise nicht grösser als 500x500) und nach Drücken des Buttons „Color All But One“, dass aus dem zuvor aufgerufenen Bild ein Tortenstück „herausgeschnitten“ wird.
Der grosse Rest der „Torte“ wird lediglich auf transparent geschaltet und ist dadurch nicht mehr sichtbar.
Meine Frage nun:
Wie kann ich mit dem sichtbaren „Tortenstück“ als separates Objekt weiterarbeiten, ohne jedesmal die gesamte „Torte“ zeichnen zu müssen?
Also, wie könnte ich das sichtbare „Pie“ zum Beispiel kopieren und zusätzlich zum dem vorhandenen darstellen?
[autoit]#include <GUIConstantsEx.au3>
[/autoit][autoit][/autoit][autoit]
#include <StaticConstants.au3>
#include <GDIPlus.au3>Opt('MustDeclareVars', 1)
[/autoit][autoit][/autoit][autoit]Global $msg, $hGUI, $floor1, $loadPIC, $ColorAllButOnePie
[/autoit][autoit][/autoit][autoit]
Global $hGraphics1, $hImage1, $PIC, $PICx, $PICyGlobal $floor1x = 500
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global $floor1y = 500$hGUI = GUICreate("", 600, 600)
[/autoit][autoit][/autoit][autoit]$loadPIC = GUICtrlCreateButton("Bild Laden", 513, 100, 85)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$ColorAllButOnePie = GUICtrlCreateButton("Color All But One", 513, 140, 85)$floor1 = GUICtrlCreateGraphic(10, 10, $floor1x, $floor1y)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetBkColor($floor1, 0xFFece9d8) ;0xffffff)
GUICtrlSetGraphic(-1, $GUI_GR_RECT, 0, 0, $floor1x, $floor1y)GUISetState()
[/autoit][autoit][/autoit][autoit]_GDIPlus_Startup()
[/autoit][autoit][/autoit][autoit]While 1
[/autoit][autoit][/autoit][autoit]
$msg = GUIGetMsg()Select
[/autoit][autoit][/autoit][autoit]
Case $msg = $GUI_EVENT_CLOSE
ExitLoopCase $msg = $loadPIC
[/autoit][autoit][/autoit][autoit]
_loadPIC()Case $msg = $ColorAllButOnePie
[/autoit][autoit][/autoit][autoit]
_ColorAllButOnePie($floor1x, $floor1y, $hGraphics1, $PICx, $PICy, 0, 300)EndSelect
[/autoit][autoit][/autoit][autoit]
If $msg = $GUI_EVENT_CLOSE Then ExitLoopWEnd
[/autoit][autoit][/autoit][autoit]_GDIPlus_GraphicsDispose($hGraphics1)
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_ImageDispose($hImage1)
_GDIPlus_Shutdown()Func _loadPIC()
[/autoit][autoit][/autoit][autoit]$PIC = FileOpenDialog("Bitte Bild auswählen", "J:\_LW_K\__OwnProjects\_autoIt\LissajousUndAndere\tesselation\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
[/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsClear($hGraphics1, 0xFFece9d8)$hImage1 = _GDIPlus_ImageLoadFromFile($PIC)
[/autoit][autoit][/autoit][autoit]$PICx = _GDIPlus_ImageGetWidth($hImage1)
[/autoit][autoit][/autoit][autoit]
$PICy = _GDIPlus_ImageGetHeight($hImage1)
$hGraphics1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))_GDIPlus_GraphicsDrawImage ($hGraphics1, $hImage1, $floor1x/2-$PICx/2, $floor1y/2-$PICy/2)
[/autoit][autoit][/autoit][autoit]EndFunc
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Func _ColorAllButOnePie($hGuiX, $hGuiY, $hGraphic, $PICx, $PICy, $StartPie, $EndPie)
[/autoit][autoit][/autoit][autoit]
Local $Diag = Sqrt(($PICx*$PICx) + ($PICy*$PICy)) ; Berechnung der Bilddiagonale
Local $SegmentX = ($Diag-$PICx)/2 ; Berechnung des aus dem Kreis herausstehenden Segments zwischen Kreis und Rechteck des Bildes
Local $SegmentY = ($Diag-$PICy)/2 ; " "Local $MidX = $hGuiX/2-$PICx/2 ; Berechnung der Bildmitte
[/autoit][autoit][/autoit][autoit]
Local $MidY = $hGuiY/2-$PICy/2 ; " "Local $iTrans = 255 ;255
[/autoit][autoit][/autoit][autoit]Local $hBrush = _GDIPlus_BrushCreateSolid("0x" & Hex($iTrans, 2) & "ece9d8")
[/autoit][autoit][/autoit][autoit]_GDIPlus_GraphicsFillPie($hGraphic, $MidX-$SegmentX, $MidY-$SegmentY, $PICx+($Diag-$PICx), $PICy+$Diag-$PICy, $StartPie, $EndPie, $hBrush)
[/autoit][autoit][/autoit][autoit][/autoit]
EndFunc -
So, hab's nun doch hinbekommen.
Eigentlich völlig simpel (kopfschüttel).
[autoit]; Autoren: Code-Schnipsel von diversen Mods und Usern aus dem Autoit-Forum
[/autoit][autoit][/autoit][autoit]#include <GDIPlus.au3>
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>Opt("MustDeclareVars", 1)
[/autoit][autoit][/autoit][autoit]Global $hGUI, $floor1, $floor2, $hImage1, $hImage2, $hGraphic1, $hGraphic2
[/autoit][autoit][/autoit][autoit]
Global $PIC, $PicX, $PicY
Global $msg, $load, $clearGlobal $dll[3], $DeskHDC, $GUIHDC
[/autoit][autoit][/autoit][autoit]$dll[1] = DllOpen ( "user32.dll")
[/autoit][autoit][/autoit][autoit]
$dll[2] = DllOpen ( "gdi32.dll")Global $aPoints[5][2]
[/autoit][autoit][/autoit][autoit]
Global $aPointsNew
Global $Pi = 4 * ATan(1)
Global $Pi_Div_180 = $Pi / 180Global $MagWidth = 500
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global $MagHeight = 500
Global $MagZoom = 1$hGUI = GUICreate("Meine Zeichnung", 1200, 600)
[/autoit][autoit][/autoit][autoit]$load = GUICtrlCreateButton("Load Pic", 540, 40, 60)
[/autoit][autoit][/autoit][autoit]
;$clear = GUICtrlCreateButton("Clear Pic", 540, 70, 60)$floor1 = GUICtrlCreateGraphic(20, 20, 500, 500)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetBkColor($floor1, 0xffffff)
;GUICtrlSetColor($floor1, 0)$floor2 = GUICtrlCreateGraphic(620, 20, 500, 500)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetBkColor($floor2, 0xffffff)GUISetState()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]$DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$GUIHDC = DLLCall("user32.dll","int","GetDC","hwnd",GUICtrlGetHandle($floor2))_GDIPlus_Startup()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))While 1
[/autoit][autoit][/autoit][autoit]$msg = GUIGetMsg()
[/autoit][autoit][/autoit][autoit]_MAG()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Select
[/autoit][autoit][/autoit][autoit]
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $load
_load()
Case $msg = $clear
;_clearPIC()
EndSelect
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd_GDIPlus_ImageDispose($hImage1)
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_ImageDispose($hImage2)
_GDIPlus_GraphicsDispose($hGraphic1)
_GDIPlus_GraphicsDispose($hGraphic2)
_GDIPlus_Shutdown()
DllClose ($dll[1])
DllClose ($dll[2])Func _MAG()
[/autoit][autoit][/autoit][autoit]
Local $i, $x1, $y1
Local $anzahlFenster = 4
Local $var = 360 / $anzahlFenster
Local $r = 125For $i = 1 to 360 step $var
[/autoit][autoit][/autoit][autoit]
$x1 = $r * Sin($i * $Pi_Div_180) + 500/4
$y1 = $r * Cos($i * $Pi_Div_180) + 500/4If Not @error Then
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Local $Result = DllCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
$x1, "int", $y1 , "int", $MagWidth/4 * $MagZoom, "int", $MagHeight/4 * $MagZoom, "int", $DeskHDC[0], "int", _
MouseGetPos(0), "int", MouseGetPos(1), "int", $MagWidth/4, "int", $MagHeight/4, _
"long", $SRCCOPY)
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
DLLCall("user32.dll","int","ReleaseDC","int",$GUIHDC[0],"hwnd",GUICtrlGetHandle($floor2))
next
EndFuncFunc _load()
[/autoit][autoit][/autoit][autoit]
$PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 ) _GDIPlus_GraphicsClear($hGraphic1, 0xFFece9d8)$hImage1 = _GDIPlus_ImageLoadFromFile ($PIC)
[/autoit][autoit][/autoit][autoit]
$PicX = _GDIPlus_ImageGetWidth($hImage1)
$PicY = _GDIPlus_ImageGetHeight($hImage1)$hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))
[/autoit][autoit][/autoit][autoit]_GDIPlus_GraphicsDrawImage ($hGraphic1, $hImage1, 0, 0)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
; _GDIPlus_GraphicsDrawRect($hGraphic1, 0, 0, $PicX, $PicY)
EndFuncFunc _clearPic()
[/autoit][autoit][/autoit][autoit][/autoit]
_GDIPlus_GraphicsClear($hGraphic1, 0xFFFFFFFF) ;0xFFece9d8)
;_GDIPlus_GraphicsClear($hGraphic2, 0xFFece9d8)
EndFuncVielleicht kann aber doch noch jemand drüberschauen, ob die DLLCalls richtig initialisiert und positioniert sind.
Ansonsten noch ein schönes Restwochenende.
-
Hi,
inzwischen ist der Wald derart dicht bewachsen, dass ich anscheinend keinen einzelnen Baum mehr erkennen kann.Ich habe mir mal genauer die Lupenfunktion angesehen und stehe nun vor dem Problem, dass ich es nicht schaffe, z. B. vier Lupenfenster in einer Schleife zu erstellen. Einzeln klappt es zwar, dennoch bin ich mir auch hier nicht sicher, ob ich die verschiedenen Aufrufe (DllCall-Call, -Open –Release) oder auch das Handling von $GUIHDC und $GUIHDC[0]) an die richtigen Stellen im Code positioniert habe oder nicht.
An DLLs habe ich mich bisher erfolgreich vorbei gedrückt... bisher ...Lange Rede, kurzer Sinn:
Kann sich einer erbarmen, mir auf die Sprünge zu helfen, um mehrere Lupenfenster in einer Schleife zu erstellen und die verschiedenen DLL-Aufrufe richtig im Code zu positionieren?Code mit einem Lupenfenster:
[autoit]; Autoren: Code-Schnipsel von diversen Mods und Usern aus dem Autoit-Forum
[/autoit][autoit][/autoit][autoit]#include <GDIPlus.au3>
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>Opt("MustDeclareVars", 1)
[/autoit][autoit][/autoit][autoit]Global $hGUI, $floor1, $floor2, $hImage1, $hImage2, $hGraphic1, $hGraphic2
[/autoit][autoit][/autoit][autoit]
Global $PIC, $PicX, $PicY
Global $msg, $load, $clearGlobal $dll[3], $DeskHDC, $GUIHDC
[/autoit][autoit][/autoit][autoit]$dll[1] = DllOpen ( "user32.dll")
[/autoit][autoit][/autoit][autoit]
$dll[2] = DllOpen ( "gdi32.dll")Global $MagWidth = 500
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global $MagHeight = 500
Global $MagZoom = 1$hGUI = GUICreate("Meine Zeichnung", 1200, 600)
[/autoit][autoit][/autoit][autoit]$load = GUICtrlCreateButton("Load Pic", 540, 40, 60)
[/autoit][autoit][/autoit][autoit]
;$clear = GUICtrlCreateButton("Clear Pic", 540, 70, 60)$floor1 = GUICtrlCreateGraphic(20, 20, 500, 500)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetBkColor($floor1, 0xffffff)
;GUICtrlSetColor($floor1, 0)$floor2 = GUICtrlCreateGraphic(620, 20, 500, 500)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetBkColor($floor2, 0xffffff)GUISetState()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]$DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$GUIHDC = DLLCall("user32.dll","int","GetDC","hwnd",GUICtrlGetHandle($floor2))_GDIPlus_Startup()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))While 1
[/autoit][autoit][/autoit][autoit]$msg = GUIGetMsg()
[/autoit][autoit][/autoit][autoit]_MAG()
[/autoit][autoit][/autoit][autoit]Select
[/autoit][autoit][/autoit][autoit]
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $load
_load()
Case $msg = $clear
;_clearPIC()
EndSelect
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd_GDIPlus_ImageDispose($hImage1)
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsDispose($hGraphic1)
_GDIPlus_Shutdown()
DllClose ($dll[1])
DllClose ($dll[2])Func _MAG()
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
If Not @error Then
Local $Result = DllCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
100, "int", 125 , "int", $MagWidth/4 * $MagZoom, "int", $MagHeight/4 * $MagZoom, "int", $DeskHDC[0], "int", _
MouseGetPos(0), "int", MouseGetPos(1), "int", $MagWidth/4, "int", $MagHeight/4, _
"long", $SRCCOPY)
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
DLLCall("user32.dll","int","ReleaseDC","int",$GUIHDC[0],"hwnd",GUICtrlGetHandle($floor2))
EndFuncFunc _load()
[/autoit][autoit][/autoit][autoit]
$PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
_GDIPlus_GraphicsClear($hGraphic1, 0xFFece9d8)$hImage1 = _GDIPlus_ImageLoadFromFile ($PIC)
[/autoit][autoit][/autoit][autoit]
$PicX = _GDIPlus_ImageGetWidth($hImage1)
$PicY = _GDIPlus_ImageGetHeight($hImage1)$hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))
[/autoit][autoit][/autoit][autoit]_GDIPlus_GraphicsDrawImage ($hGraphic1, $hImage1, 0, 0)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
; _GDIPlus_GraphicsDrawRect($hGraphic1, 0, 0, $PicX, $PicY)
EndFuncFunc _clearPic()
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
_GDIPlus_GraphicsClear($hGraphic1, 0xFFFFFFFF) ;0xFFece9d8)
;_GDIPlus_GraphicsClear($hGraphic2, 0xFFece9d8)
EndFunc -
Vielen Dank, euch beiden.
-
Hi, ich bin neu hier und hatte bezüglich eines Problems ein Thema erstellt.
Das Problem ist zwischenzeitlich gelöst, doch wie markiere ich mein Thema als "gelöst"?
Vielen Dank vorab für eine Antwort. -
Nachdem ich den Code „Rotating Image 2.au3“ (drei Postings zuvor) zunächst verworfen hatte, weil er mir auf den ersten Blick für meine Zwecke nicht geeignet erschien, habe ich ihn mir nun doch noch einmal genauer angesehen. Auch wenn ich den grössten Teil des Codes herausgelöscht habe (ich hätte wohl auch bei Null anfangen können ), hat die Experimentiererei mit dem Restcode doch dazu geführt, endlich meine ursprüngliche Frage zu beantworten.
Mit dem nachfolgenden Code können Bilder im Format JPG, BMP und PNG geladen werden. Es können sicher auch andere Formate geladen werden, die Transparenz funktioniert jedoch nur mit PNG-Bildern. Darauf kam es mir in erster Linie auch an. Die Bilder lassen sich mit der Maus frei auf dem Desktop verschieben.
Bei der Veränderung von Parametern im Code können zur besseren Orientierung die Zeile 71 (…GraphicsDrawImageRect) aktiviert, und der Farbwert in Zeile 67 (…GraphicsClear) getauscht werden. Damit ist das komplette Fenster, in dem sich die Grafik bewegt, ersichtlich.
Zum Testen hatte ich keine Schleife eingebaut, also nach dem Laden des Bildes nicht nur einmal auf den Button „rotate“ klicken.
Also, Matrix-Funktionen lassen sich auch auf mit der Maus verschiebbare transparente PNG-Bilder anwenden.
[autoit]
[/autoit][autoit][/autoit][autoit]
#include <GDIPlus.au3>
#include <windowsconstants.au3>
#Include <Misc.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>Opt("MustDeclareVars", 1)
[/autoit][autoit][/autoit][autoit]Global $hGUI_Main, $hwnd, $msg, $load, $rotate, $close, $graphics, $bitmap, $backbuffer, $matrix, $image, $PIC
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Global Const $AC_SRC_ALPHA = 1
[/autoit][autoit][/autoit][autoit]$hGUI_Main = GUICreate("GDI+", 400, 300, 400, 400, $WS_CAPTION)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$load = GuiCtrlCreateButton("load" ,10,10)
$rotate = GuiCtrlCreateButton("rotate" ,10,40)
$close = GuiCtrlCreateButton("end" ,10,70)
GUISetState()$hwnd = GUICreate("Test", 100, 100, 90, 26, $WS_POPUPWINDOW , BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI_Main)
[/autoit][autoit][/autoit][autoit]_GDIPlus_Startup()
[/autoit][autoit][/autoit][autoit]$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
[/autoit][autoit][/autoit][autoit]
$bitmap = _GDIPlus_BitmapCreateFromGraphics(300, 300, $graphics)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)$matrix = _GDIPlus_MatrixCreate()
[/autoit][autoit][/autoit][autoit]
_GDIPlus_MatrixTranslate($matrix, 150, 150)
While 1$msg = GUIGetMsg()
[/autoit][autoit][/autoit][autoit]Select
[/autoit][autoit][/autoit][autoit]
case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $load
_load()
Case $msg = $rotate
_rotate()
Case $msg = $close
_close()
EndSelectWEnd
[/autoit][autoit][/autoit][autoit]_GDIPlus_ImageDispose($image)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsDispose($graphics)
_WinAPI_DeleteObject($bitmap)
_GDIPlus_MatrixDispose($matrix)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown ()Func _load()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
If $PIC = "" Then Return
_rotate()
EndFuncFunc _rotate()
[/autoit][autoit][/autoit][autoit]
$image = _GDIPlus_ImageLoadFromFile($PIC)_GDIPlus_GraphicsClear($backbuffer, $GDIP_PXF32ARGB) ;0xFF123456)
[/autoit][autoit][/autoit][autoit]
_GDIPlus_MatrixRotate($matrix, -15)
_GDIPlus_GraphicsSetTransform($backbuffer, $matrix)
_GDIPlus_GraphicsDrawImageRect($backbuffer, $image, -100, -100, 200, 200)
;_GDIPlus_GraphicsDrawRect($backbuffer, -100, -100, 200, 200) ;SetBitMap($hwnd, $bitmap, 100)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState()
EndFuncFunc WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
If ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
EndFuncFunc SetBitmap($hGUI, $hImage, $iOpacity)
[/autoit][autoit][/autoit][autoit]
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend$hScrDC = _WinAPI_GetDC(0)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize )
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha" , $iOpacity )
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC (0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC ($hMemDC)
EndFuncFunc _close()
[/autoit][autoit][/autoit][autoit][/autoit]
Exit
EndFunc -
Bei der Spielerei mit den Matrix-Funktionen ist u. a. nachstehender Code entstanden (das meiste natürlich aus dem Forum geklaut).
Nach Laden eines Bildes lässt sich dieses mittels der Tasten „Pfeil oben“ und „Pfeil unten“ auf dem Bildschirm in Echtzeit verkleinern bzw. vergrößern. Bilder im PNG-Format erscheinen transparent.
Der Redraw funktioniert jedoch nicht hundertprozentig.
Bei der Darstellung von PNG-Bildern, die innerhalb des Bildes einen Ausschnitt aufzeigen, wie zum Beispiel bei einem Ring, entsteht beim Vergrössern ein eigentlich nicht erwünschter Effekt, der aber sofort verschwindet, sobald man das Bild wieder um einen Schritt verkleinert.
Bei anderen Bild-Formaten müsste auch noch einmal nachgerechnet werden.
Ausserdem verschwindet der „Insert“-Button hin und wieder, je nachdem, auf welche Grösse das Bild gebracht wird. Der Button erscheint aber sofort wieder, sobald man mit der Maus über die Position des Buttons fährt. Eigentlich gehört der Button bei dieser Applikation ja auch nicht in das Fenster. Das Laden eines Bildes sollte hier aus einem Menu heraus erfolgen. Ich hatte es aber erstmal so belassen.
Vielleicht kann ja jemand den Code gebrauchen und entsprechend „umstricken“.
[autoit]
[/autoit][autoit][/autoit][autoit]
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6#include <GDIPlus.au3>
[/autoit][autoit][/autoit][autoit]
#include <Misc.au3>
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <GDIPlusConstants.au3>Opt("MustDeclareVars", 1)
[/autoit][autoit][/autoit][autoit]Global $hGui, $msg, $insert, $PIC, $hGraphic, $hBrush, $hImage, $WindowWidth, $WindowHeight, $x, $y, $ImageWidth, $ImageHeight, $iWidth, $iHeight, $hMatrix
[/autoit][autoit][/autoit][autoit]$hGui = GUICreate("SCALE", 800, 600)
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
$insert = GuiCtrlCreateButton("Insert Pic" ,10,10)
GUISetState()While GUIGetMsg() <> -3
[/autoit][autoit][/autoit][autoit]
$msg = GUIGetMsg()$x = 1.0
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
$y = 1.0
If _IsPressed ("26") Then
_SizeBig()
ElseIf _IsPressed ("28") Then
_SizeSmall()
EndIfSelect
[/autoit][autoit][/autoit][autoit]
Case $msg = $GUI_EVENT_CLOSE
ExitLoopCase $msg = $insert
[/autoit][autoit][/autoit][autoit]
_GDIPlus_Startup()
$WindowWidth = 800
$WindowHeight = 600$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
[/autoit][autoit][/autoit][autoit]
$hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $WindowWidth, $WindowHeight, $hBrush)$PIC = FileOpenDialog("Bitte Bild auswählen", "C:", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
[/autoit][autoit][/autoit][autoit]
$hImage = _GDIPlus_ImageLoadFromFile($PIC)
$ImageWidth = _GDIPlus_ImageGetWidth($hImage)
$ImageHeight = _GDIPlus_ImageGetHeight($hImage)
$iWidth = _GDIPlus_ImageGetWidth($hImage) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage)
$hMatrix = _GDIPlus_MatrixCreate()
_GDIPlus_MatrixTranslate($hMatrix, $WindowWidth/2, $WindowHeight/2)_GDIPlus_MatrixScale($hMatrix, 0.5, 0.5)
[/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
$hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
_GDIPlus_GraphicsFillRect($hGraphic, $ImageWidth, $ImageHeight, -$iWidth / 2, -$iHeight / 2, $hBrush)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)EndSelect
[/autoit][autoit][/autoit][autoit]WEnd
[/autoit][autoit][/autoit][autoit]_GDIPlus_MatrixDispose($hMatrix)
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_Shutdown()Func _SizeBig()
[/autoit][autoit][/autoit][autoit]
_GDIPlus_MatrixScale($hMatrix, $x+0.05, $y+0.05)
_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
;_GDIPlus_GraphicsClear($hGraphic)
$hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
_GDIPlus_GraphicsFillRect($hGraphic, -$ImageWidth, -$ImageHeight, -$iWidth / 2, -$iHeight / 2, $hBrush)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)
EndFuncFunc _SizeSmall()
[/autoit]
_GDIPlus_MatrixScale($hMatrix, $x-0.05, $y-0.05)
_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
;_GDIPlus_GraphicsClear($hGraphic)
$hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
_GDIPlus_GraphicsFillRect($hGraphic, -$ImageWidth, -$ImageHeight, $iWidth*2, $iHeight*2, $hBrush)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)
EndFunc