Ich habe die _WinAPI_BitmapCopyToClipboard() Funktion ein wenig erweitert:
AutoIt
#include <Clipboard.au3>
#include <GDIPlus.au3>
#include <Memory.au3>
_GDIPlus_Startup()
Global $sFile = StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png")
Global $hImage = _GDIPlus_ImageLoadFromFile($sFile)
If _WinAPI_BitmapCopyToClipboard($hImage) Then
MsgBox(0, "Info", "Image copied to clipboard", 30)
Else
MsgBox(16, "Error", "An error has occured: " & @error, 30)
EndIf
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
; #FUNCTION# ====================================================================================================================
; Name ..........: _WinAPI_BitmapCopyToClipboard
; Description ...: Copies a GDIPlus bitmap to the clipboard using CF_DIBV5, CF_BITMAP or PNG format.
; Syntax ........: _WinAPI_BitmapCopyToClipboard($hImage)
; Parameters ....: $hImage - a GDIPlus bitmap handle.
; $iMode - [optional] an integer value. Default is 3.
; Return values .: True on success otherwise False
; Author ........: UEZ
; Modified ......:
; Remarks .......: It copies the color values from a GDIPlus bitmap to a device-independent bitmap (DIB) v5 32-bit or raw PNG data
; (mode 1 and 2) to support transparent bitmaps (might not supported by an application).
; Links .........: $tagBITMAPV5HEADER -> http://msdn.microsoft.com/en-us/library/windows/desktop/dd183381(v=vs.85).aspx
; Version .......: 2017-08-16
; Example .......: No
; ===============================================================================================================================
Func _WinAPI_BitmapCopyToClipboard($hImage, $iMode = 3)
If _ClipBoard_Open(0) Then
If _ClipBoard_Empty() Then
$iMode = $iMode < 1 ? 1 : $iMode > 3 ? 3 : $iMode
Switch $iMode
Case 1
Local Const $aDim = _GDIPlus_ImageGetDimension($hImage)
If @error Then Return SetError(3, 0, False)
Local Const $iW = $aDim[0], $iH = $aDim[1]
Local $tBMPData = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
If @error Then Return SetError(4, 0, False)
Local Const $iBmpSize = $iH * $tBMPData.Stride
Local $tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)
Local Const $iBuffLen = DllStructGetSize($tBIV5HDR) + $iBmpSize
Local $hMem = _MemGlobalAlloc($iBuffLen + 1, $GHND)
Local Const $pDIBV5 = _MemGlobalLock($hMem)
$tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER, $pDIBV5)
With $tBIV5HDR
.bV5Size = DllStructGetSize($tBIV5HDR)
.bV5Width = $iW
.bV5Height = $iH
.bV5Planes = 1
.bV5BitCount = 32
.biCompression = $BI_RGB
.bV5ClrUsed = 0
.bV5ClrImportant = 0
.bV5SizeImage = 0
.bV5CSType = 2
.bV5Intent = 4
.bV5AlphaMask = 0xFF000000
.bV5RedMask = 0x00FF0000
.bV5GreenMask = 0x0000FF00
.bV5BlueMask = 0x000000FF
EndWith
Local $pBits
Local Const $hBitmap = _WinAPI_CreateDIBSection(0, $tBIV5HDR, $DIB_RGB_COLORS, $pBits)
_WinAPI_SetBitmapBits($hBitmap, $iBuffLen, $tBMPData.Scan0)
_MemMoveMemory($pBits, $pDIBV5 + $tBIV5HDR.bV5Size, $iBmpSize)
Local $iError = 0
If Not _ClipBoard_SetDataEx($hMem, $CF_DIBV5) Then $iError += 1
_GDIPlus_BitmapUnlockBits($hImage, $tBMPData)
_MemGlobalUnlock($pDIBV5)
_MemGlobalFree($hMem)
_WinAPI_DeleteObject($hBitmap)
If $iError Then Return SetError(5, 0, False)
Case 2
Local $binImage = _GDIPlus_StreamImage2BinaryString($hImage, "PNG")
If @error Then Return SetError(6, 0, False)
Local $iFormat = _ClipBoard_RegisterFormat("PNG")
If Not _ClipBoard_SetData($binImage, $iFormat) Then
$binImage = 0
Return SetError(7, 0, False)
EndIf
$binImage = 0
Case 3
Local Const $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
If @error Then Return SetError(8, 0, False)
Local $hHBmp_Clipboard = _WinAPI_CopyImage($hHBmp, $IMAGE_BITMAP, 0, 0, BitOR($LR_COPYDELETEORG, $LR_COPYRETURNORG))
_ClipBoard_SetDataEx($hHBmp_Clipboard, $CF_BITMAP)
_WinAPI_DeleteObject($hHBmp)
_WinAPI_DeleteObject($hHBmp_Clipboard)
EndSwitch
Else
Return SetError(2, 0, False)
EndIf
_ClipBoard_Close()
Else
Return SetError(1, 0, False)
EndIf
Return True
EndFunc ;==>_WinAPI_BitmapCopyToClipboard
Func _GDIPlus_StreamImage2BinaryString($hBitmap, $sFormat = "JPG", $iQuality = 80, $bSave = False, $sFilename = @ScriptDir & "\Converted.jpg") ;coded by UEZ 2013 build 2014-01-25 (based on the code by Andreik)
Local $sImgCLSID, $tGUID, $tParams, $tData
Switch $sFormat
Case "JPG"
$sImgCLSID = _GDIPlus_EncodersGetCLSID($sFormat)
$tGUID = _WinAPI_GUIDFromString($sImgCLSID)
$tData = DllStructCreate("int Quality")
$iQuality = $iQuality < 0 ? 0 : $iQuality > 100 ? 100 : $iQuality
DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100
Local $pData = DllStructGetPtr($tData)
$tParams = _GDIPlus_ParamInit(1)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
Case "PNG", "BMP", "GIF", "TIF"
$sImgCLSID = _GDIPlus_EncodersGetCLSID($sFormat)
$tGUID = _WinAPI_GUIDFromString($sImgCLSID)
Case Else
Return SetError(1, 0, 0)
EndSwitch
Local $hStream = _WinAPI_CreateStreamOnHGlobal() ;http://msdn.microsoft.com/en-us/library/ms864401.aspx
If @error Then Return SetError(2, 0, 0)
_GDIPlus_ImageSaveToStream($hBitmap, $hStream, DllStructGetPtr($tGUID), DllStructGetPtr($tParams))
If @error Then Return SetError(3, 0, 0)
Local $hMemory = _WinAPI_GetHGlobalFromStream($hStream) ;http://msdn.microsoft.com/en-us/library/aa911736.aspx
If @error Then Return SetError(4, 0, 0)
Local $iMemSize = _MemGlobalSize($hMemory)
If Not $iMemSize Then Return SetError(5, 0, 0)
Local $pMem = _MemGlobalLock($hMemory)
$tData = DllStructCreate("byte[" & $iMemSize & "]", $pMem)
Local $bData = DllStructGetData($tData, 1)
_WinAPI_ReleaseStream($hStream) ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms221473(v=vs.85).aspx
_MemGlobalFree($hMemory)
If $bSave Then
Local $hFile = FileOpen($sFilename, 18)
If @error Then Return SetError(6, 0, $bData)
FileWrite($hFile, $bData)
FileClose($hFile)
EndIf
Return $bData
EndFunc ;==>_GDIPlus_StreamImage2BinaryString
Alles anzeigen
Je nach Anwendung funktioniert der jeweilige Modus.