Hallo liebe Community,
ich habe vor kurzem angefangen mich mit den GDIPlus-Funktionen von AutoIt vertraut zu machen, da ich einige Bild-Analysen programmieren möchte. Dabei geht es nicht so sehr um das Tempo, sondern mehr um die Präsentation der Analyse.
Und leider scheitere ich schon an der wichtigsten Grundfunktion: Das holen einer Grafik aus der Zwischenablage nach AutoIt. Da die kleinen Tools später einmal in einer Umgebung ohne Schreibzugriff auf Datenträger laufen sollen kann ich nicht den Umweg Zwischenablage => temporäre Datei => Tool gehen... das wäre ja nicht so das Problem.
Ich muss das irgendwie ohne temporäre Datei lösen.
Das folgende Script ist meine Versuchsbasis für dieses Problem: Es lädt eine Grafik aus einer Datei und stellt diese in der linken Hälfte der GUI dar, anschließend soll eine Grafik aus der Zwischenablage geholt und in der rechten Hälfte der GUI angezeigt werden. Teil 1 (Grafik aus Datei) funktioniert wie gesagt problemlos, aber die rechte Hälfte bleibt immer leer...
Hat jemand hier auch schon mal so eine Funktion geschrieben oder hat eine Idee, was da bei mir nicht stimmt?
Hier mal das Script:
[autoit]
#include <GDIPlus.au3>
#include <Clipboard.au3>
#include <GUIConstantsEx.au3>
; Folgende Typ-Kennzeichen werden verwendet:
; $s... = Variable vom Typ STRING
; $hwnd_... = Handle eines Fensters
; $hgro_... = Handle eines Graphics-Objekts
; $himo_... = Handle eines Image-Objekts
; $hbmp_... = Handle eines Bitmaps
; $hbmo_... = Handle eines Bitmap-Objekts
; Vorbereitende Aktionen:
$sFileName = "Sterne.bmp" ; Name der Bitmap-Datei...
$hwnd_GUI = GUICreate("GUI", 201, 100)
GUISetState()
_GDIPlus_Startup()
; Handle auf das Graphics-Objekt des GUI-Fensters
$hgro_GUI = _GDIPlus_GraphicsCreateFromHWND($hwnd_GUI)
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; +++ Schritt 1: Die Bitmap-Datei laden und in der linken Hälfte des GUI-Fensters anzeigen +++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Handle auf das Image-Objekt der geladenen Bitmap-Datei...
$himo_BitmapFile = _GDIPlus_ImageLoadFromFile($sFileName)
ConsoleWrite("Größe der geladenen Bitmap-Grafik: " & _GDIPlus_ImageGetWidth($himo_BitmapFile) & " x " & _GDIPlus_ImageGetHeight($himo_BitmapFile) & " (BxH)" & @CRLF)
; Das geladene Bild in der linken Hälfte des GUI-Fensters anzeigen. Es wird immer auf 100x100 Pixel skaliert
_GDIPlus_GraphicsDrawImageRect($hgro_GUI, $himo_BitmapFile, 0, 0, 100, 100)
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; +++ Schritt 2: Die sich in der Zwischenablage befindliche Grafik laden und in der rechten Hälfe des GUI-Fensters anzeigen +++
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$hbmp_ClipboardBitmap = _ClipBoard_GetData($CF_BITMAP) ; Laut Hilfe liefert diese Funktion ein Handle des Bitmaps in der Zwischenablage
$hbmo_ClipboardBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hbmp_ClipboardBitmap) ; und so sollte aus dem HBITMAP ein Bitmap-Objekt werden
;
$himo_ClipboardBitmap = _GDIPlus_ImageGetGraphicsContext($hbmp_ClipboardBitmap) ; In der Hilfe zu _GDIPlus_ImageGetGraphicsContext wird gezeigt, das ein HBITMAP so in ein Image umgewandelt werden kann,
; dort wird per _ScreenCapture_Capture ein HBITMAP zurückgeliefert...
_GDIPlus_GraphicsDrawImageRect($hgro_GUI, $himo_ClipboardBitmap, 101, 0, 100, 100)
; Jetzt noch warten bis das GUI-Fenster geschlossen wird, dann endet das Script.
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
Func OnAutoItExit()
_GDIPlus_Shutdown()
EndFunc
Vielen Dank schon mal im voraus.
Ach ja, die Datei Sterne.bmp hab ich mal als Dateianhang beigefügt.
Gruss Thorsten