I'm still working on it and I've a bitmapv5 but it is empty...
#include <Constants.au3>
#include <Clipboard.au3>
#include <GDIPlus.au3>
;~ #include "WinAPIEx.au3"
_GDIPlus_Startup()
Global $hBitmap = _GDIPlus_BitmapCreateFromFile(StringReplace(@AutoItExe, "autoit3.exe", "ExamplesGUITorus.png"))
$hHBitmap = WinAPI
_BitmapCreateDIBFromBitmap
($hBitmap)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hHBitmap = ' & $hHBitmap & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
_ClipBoard_Open(0)
_ClipBoard_Empty()
;~ Global $hBitmap2 = _WinAPI_CopyImage($hHBitmap, 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG) ;<a href='http://msdn.microsoft.com/en-us/library/windows/desktop/ms648031(v=vs.85' class='bbc_url' title='External link' rel='nofollow external'>http://msdn.microsoft.com/en-us/library/windows/desktop/ms648031(v=vs.85</a>).aspx
$iResult = _ClipBoard_SetDataEx($hHBitmap, $CF_DIBV5)
;~ $iResult = _ClipBoard_SetDataEx($hHBitmap, $CF_BITMAP)
;~ $iResult = _ClipBoard_SetDataEx($hBitmap2, $CF_BITMAP)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iResult = ' & $iResult & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
If $iResult Then MsgBox(0, "Success", "Image copied to clipboard properly!", 10)
_ClipBoard_Close()
_GDIPlus_BitmapDispose($hBitmap)
_WinAPI_DeleteObject($hHBitmap)
_GDIPlus_Shutdown()
Exit
;~ Func _WinAPI_CopyImage($hImage, $iType = 0, $xDesired = 0, $yDesired = 0, $iFlags = 0); from _WinAPIEx by Yashied
;~ Local $Ret = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hImage, 'int', $iType, 'int', $xDesired, 'int', $yDesired, 'int', $iFlags)
;~ If (@error) Or (Not $Ret[0]) Then Return SetError(1, 0, 0)
;~ Return $Ret[0]
;~ EndFunc ;==>_WinAPI_CopyImage
Func WinAPI
_BitmapCreateDIBFromBitmap
($hBitmap)
Local $aRet, $tData, $pBits, $hResult = 0, $tBIV5HDR, $iBuffLen, $hMem, $pPackedDIBV5, $iStride, $iScan0
Local Const $tagBITMAPV5HEADER = 'dword bV5Size;long bV5Width;long bV5Height;ushort bV5Planes;ushort bV5BitCount;dword bV5Compression;dword bV5SizeImage;long bV5XPelsPerMeter;long bV5YPelsPerMeter;dword bV5ClrUsed;dword bV5ClrImportant;dword bV5RedMask;dword bV5GreenMask;dword bV5BlueMask;dword bV5AlphaMask;dword bV5CSType;int bV5Endpoints[3];dword bV5GammaRed;dword bV5GammaGreen;dword bV5GammaBlue;dword bV5Intent;dword bV5ProfileData;dword bV5ProfileSize;dword bV5Reserved;'
$aRet = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
If (@error) Or ($aRet[0]) Then Return 0
$tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)
$tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $aRet[2], $aRet[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$iStride = DllStructGetData($tData, "Stride")
$iScan0 = DllStructGetData($tData, "Scan0")
$iBuffLen = DllStructGetSize($tBIV5HDR) + $aRet[3] * $iStride
$hMem = _MemGlobalAlloc($iBuffLen, BitOR(0x2000, 0x002, 0x0040)) ; -> $GMEM_DDESHARE = 0x2000, $GMEM_MOVEABLE = 0x0002, $GMEM_ZEROINIT = 0x0040
$pPackedDIBV5 = _MemGlobalLock($hMem)
$tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER, $pPackedDIBV5)
DllStructSetData($tBIV5HDR, 'bV5Size', DllStructGetSize($tBIV5HDR))
DllStructSetData($tBIV5HDR, 'bV5Width', $aRet[2])
DllStructSetData($tBIV5HDR, 'bV5Height', $aRet[3])
DllStructSetData($tBIV5HDR, 'bV5Planes', 1)
DllStructSetData($tBIV5HDR, 'bV5BitCount', 32)
DllStructSetData($tBIV5HDR, 'bV5Compression', 3) ; $BI_BITFIELDS = 3
DllStructSetData($tBIV5HDR, 'bV5SizeImage', $aRet[3] * DllStructGetData($tData, 'Stride'))
DllStructSetData($tBIV5HDR, 'bV5AlphaMask', 0xFF000000)
DllStructSetData($tBIV5HDR, 'bV5RedMask', 0x00FF0000)
DllStructSetData($tBIV5HDR, 'bV5GreenMask', 0x0000FF00)
DllStructSetData($tBIV5HDR, 'bV5BlueMask', 0x000000FF)
DllStructSetData($tBIV5HDR, 'bV5CSType', 2) ; LCS_WINDOWS_COLOR_SPACE = 2
DllStructSetData($tBIV5HDR, 'bV5Intent', 4) ; $LCS_GM_IMAGES = 4
$hResult = _WinAPI
_CreateDIBitmap
(0, $tBIV5HDR, 0, $pBits) ;$DIB_RGB_COLORS = 0
$r = _WinAPI
_SetBitmapBits
($hResult, $aRet[2] * $aRet[3] * 4, $iScan0)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $r = ' & $r & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
_GDIPlus_BitmapUnlockBits($hBitmap, $tData)
_MemGlobalUnlock($hMem)
Return $hMem
EndFunc ;==>WinAPI_BitmapCreateDIBFromBitmap
Func _WinAPI
_SetBitmapBits
($hBitmap, $iSize, $pBits)
Local $Ret = DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hBitmap, 'dword', $iSize, 'ptr', $pBits)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_SetBitmapBits
Func _WinAPI
_CreateDIBitmap
($hDC, $tBITMAPINFO, $iUsage, $pBits = 0)
Local $pBI = DllStructGetPtr($tBITMAPINFO)
Local $Init = 0
If $pBits Then
$Init = 0x04
EndIf
Local $Ret = DllCall('gdi32.dll', 'ptr', 'CreateDIBitmap', 'hwnd', $hDC, 'ptr', $pBI, 'dword', $Init, 'ptr', $pBits, 'ptr', $pBI, 'uint', $iUsage)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_CreateDIBitmap
Func _WinAPI
_CreateDIBSection
($hDC, $tBITMAPINFO, $iUsage, ByRef $pBits, $hSection = 0, $iOffset = 0)
$pBits = 0
Local $Ret = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', $hDC, 'ptr', DllStructGetPtr($tBITMAPINFO), 'uint', $iUsage, 'ptr*', 0, 'ptr', $hSection, 'dword', $iOffset)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
$pBits = $Ret[4]
Return $Ret[0]
EndFunc ;==>_WinAPI_CreateDIBSection
Maybe someone has an idea...