找回密码
 加入
搜索
查看: 3301|回复: 9

[网络通信] 如何将一个位图句柄转为二进制数据

[复制链接]
发表于 2020-6-8 01:49:23 | 显示全部楼层 |阅读模式
悬赏100金钱已解决
本帖最后由 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年没接触了,丢掉了好多东西


最佳答案

查看完整内容

是这个意思吗?
发表于 2020-6-8 01:49:24 | 显示全部楼层
是这个意思吗?
#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)

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10 没错就是这个意思,发哥V5

查看全部评分

发表于 2020-6-8 02:52:03 | 显示全部楼层
如果要获取设置JPG质量后的数据,需要将位图通过设置质量后先保存到流,然后再重新从流获取。
如果是获取无损的位图数据,则可以直接锁定位图数据直接获取。
发表于 2020-6-8 07:02:52 | 显示全部楼层
你这是又突然 的出现了呀
 楼主| 发表于 2020-6-8 08:59:30 | 显示全部楼层
绿色风 发表于 2020-6-8 07:02
你这是又突然 的出现了呀

风哥,多年不见
 楼主| 发表于 2020-6-8 09:05:57 | 显示全部楼层
本帖最后由 tryhi 于 2020-6-8 09:38 编辑
afan 发表于 2020-6-8 02:52
如果要获取设置JPG质量后的数据,需要将位图通过设置质量后先保存到流,然后再重新从流获取。
如果是获取 ...

两种都可能用到,不知有没有相关UDF,有个_GDIPlus_BitmapCreateFromMemory可以将二进制数据转为位图,不知有没有反过来的函数
发表于 2020-6-8 17:04:13 | 显示全部楼层
这个帖子和你的项目差不多,可以参考一下。
https://blog.csdn.net/tsing_best/article/details/25055469
 楼主| 发表于 2020-6-8 17:40:04 | 显示全部楼层
haijie1223 发表于 2020-6-8 17:04
这个帖子和你的项目差不多,可以参考一下。
https://blog.csdn.net/tsing_best/article/details/25055469

确实很像,这好像是C语言?
发表于 2020-6-8 18:11:24 | 显示全部楼层
tryhi 发表于 2020-6-8 17:40
确实很像,这好像是C语言?

~~~~嗯,是C。
发表于 2020-6-8 18:22:30 | 显示全部楼层
都是大神帖子。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 10:37 , Processed in 0.076372 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表