如何将一个位图句柄转为二进制数据
本帖最后由 tryhi 于 2020-6-8 01:51 编辑#include <ScreenCapture.au3>
#include <File.au3>
_ScreenCapture_SetJPGQuality(30);设置屏幕截图的质量
$ScreenshotName = _TempFile(@TempDir, "test", ".jpg");创建临时文件
$screen = _ScreenCapture_Capture($ScreenshotName);屏幕截图,并保存到文件
$ScreenshotHandle = FileOpen($ScreenshotName, 16);二进制模式打开文件
$data = FileRead($ScreenshotHandle);读取文件
FileClose($ScreenshotHandle);关闭文件
FileDelete($ScreenshotName);删除文件
;;$data就是目标数据,如何不经过写入文件这个操作而得到这个数据
MsgBox(0,0,$data)
目前用先写入文件后读取文件来得到截图二进制数据,有一种脱裤子放屁的感觉,有没有什么方法可以直接由位图句柄来得到这个二进制数据。
屏幕截图函数_ScreenCapture_Capture不带参数可以得到位图句柄,按道理应该可以自从这个句柄直接得到数据
ps:自从毕业后参加工作到现在8年没接触了,丢掉了好多东西
是这个意思吗?
#NoTrayIcon
#include <ScreenCapture.au3>
#include <Memory.au3>
_GDIPlus_Startup()
Local $hBmp = _ScreenCapture_Capture()
Local $Bitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
Local $sImgCLSID = _GDIPlus_EncodersGetCLSID("jpg") ;create CLSID for a JPG image file type
Local $tGUID = _WinAPI_GUIDFromString($sImgCLSID) ;convert CLSID GUID to binary form and returns $tagGUID structure
Local $pEncoder = DllStructGetPtr($tGUID) ;get pointer of $tagGUID structure
Local $tParams = _GDIPlus_ParamInit(1) ;initialize an encoder parameter list and return $tagGDIPENCODERPARAMS structure
Local $tData = DllStructCreate("int Quality") ;create struct to set JPG quality setting
DllStructSetData($tData, "Quality", 30) ;quality 0-100 (0: lowest, 100: highest)
Local $pData = DllStructGetPtr($tData) ;get pointer from quality struct
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) ;add a value to an encoder parameter list
Local $pParams = DllStructGetPtr($tParams) ;get pointer of encoder parameter list
Local $pStream = _WinAPI_CreateStreamOnHGlobal() ;create stream
_GDIPlus_ImageSaveToStream($Bitmap, $pStream, $pEncoder, $pParams) ;save the bitmap in JPG format in memory
Local $hStream = _WinAPI_GetHGlobalFromStream($pStream)
Local $iSize = _MemGlobalSize($hStream)
Local $PMem = _MemGlobalLock($hStream)
Local $tStream = DllStructCreate("byte[" & $iSize & "]", $PMem)
Local $bData = DllStructGetData($tStream, 1)
_WinAPI_ReleaseStream($pStream)
_MemGlobalFree($hStream)
_GDIPlus_Shutdown()
MsgBox(0, 0, $bData) 如果要获取设置JPG质量后的数据,需要将位图通过设置质量后先保存到流,然后再重新从流获取。
如果是获取无损的位图数据,则可以直接锁定位图数据直接获取。 你这是又突然 的出现了呀:face (31): 绿色风 发表于 2020-6-8 07:02
你这是又突然 的出现了呀
风哥,多年不见{:1_223:} 本帖最后由 tryhi 于 2020-6-8 09:38 编辑
afan 发表于 2020-6-8 02:52
如果要获取设置JPG质量后的数据,需要将位图通过设置质量后先保存到流,然后再重新从流获取。
如果是获取 ...
两种都可能用到,不知有没有相关UDF,有个_GDIPlus_BitmapCreateFromMemory可以将二进制数据转为位图,不知有没有反过来的函数 这个帖子和你的项目差不多,可以参考一下。
https://blog.csdn.net/tsing_best/article/details/25055469 haijie1223 发表于 2020-6-8 17:04
这个帖子和你的项目差不多,可以参考一下。
https://blog.csdn.net/tsing_best/article/details/25055469
确实很像,这好像是C语言? tryhi 发表于 2020-6-8 17:40
确实很像,这好像是C语言?
~~~~嗯,是C。 都是大神帖子。。。
页:
[1]