网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月05日漏签0天
vb吧 关注:156,098贴子:1,166,206
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 19回复贴,共1页
<<返回vb吧
>0< 加载中...

有了解 GetDIBits 函数的吧友吗?

  • 只看楼主
  • 收藏

  • 回复
  • sdsxingyun
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
GetDIBits 如果调用本地BMP文件还可以处理,现在需要直接调用内存里面的图片,比如截屏后,获取RGB值,这个时候GetDIBits就不好使了。不知道内存里面的图像,GetDIBits要如何才能操作。有知道的吧友没,谢谢l


  • 隨風缒夢
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
方法一、借助PictureBox控件,作图后得到PictureBox的Image.Handle句柄作参数。
方法二、自己先创建hDC和内存位图,就有位图句柄hBmp,这样在作图后就可以用hBmp作参数


2025-08-05 03:16:02
广告
不感兴趣
开通SVIP免广告
  • sdsxingyun
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@隨風缒夢: 我的笔记本是系统缩放150%的,这样子的话,截出来的图居然是100%的高清,没有缩放。所以得到的RGB值是对不上的;
而且扯到以前写的一个程序就是写了一个模拟QQ全屏截图的软件,也是同样的问题,如果不在系统里面设置强制关闭DPI的话,那截出来的屏就是半截;
不知道我说清楚没有,高手有办法解决吗? 就是我想屏幕显示是啥就是啥,屏幕高清就高清,缩放就缩放;


  • 隨風缒夢
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

将这个写入文本文件,保存成xxx.exe.manifest,和exe放在同目录。或者放入工程资源中(需要特殊处理,或借助第三方资源编辑器,主要VB不支持),这样可以嵌入在exe,不需要额外的附带文件。相关DPI的API函数也可以,不过有些要win8以上支持(具体我也没试)。


  • sdsxingyun
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@隨風缒夢 : 我到微软的官网去查了技术资料,微软也建议用manifest,不过我把三个API也测试了一下,还是用manifest好一点;用MT整合的。
再次感谢;


  • 👨🏿‍🦱
  • API
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
setProcessDPIAware
用这个试试


  • klimaa
  • 简易程序
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@隨風缒夢
尴尬了。一样的BitBlt代码(其实就是2行),在我笔记本上全屏拷贝会放大(图1),在台式机上维持不变(图2)。图片里左上角是桌面,右下是截屏。操作系统都一样的Win11,笔记本175%自定义,台式机200%自定义。
使用楼上的manifest没有影响。
但是如果不是通过getDC(0)或者getDestWindows截桌面,而是拷贝其它Picture,大小都是不变的。



  • 隨風缒夢
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@klimaa
这个DPI也是比较复杂的,VB6支持得不是很好(就算通过manifest,主要VB6的screen.TwipsPerPixelX是单精度型的,而VB6处理后都是按整数输出的,也就是说VB6在某些自定义高DPI下也是会出错的(比例不对,估计和VB6内部把小数部分割了按整数比例调整导致的)。还有系统DPI在vista到win8.1之前没有虚拟化DPI,到win10后引入了虚拟化DPI,可能需要针对不同系统版本进行DPI处理
VB自身的原因,和系统无关,所以GetDC(0)获取屏幕没有问题


2025-08-05 03:10:02
广告
不感兴趣
开通SVIP免广告
  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可能是这项问题(应用程序调用此函数时,不得在设备上下文中选择 由 hbmp 参数标识的位图):

所以,操作你的内存中 DDB 位图时需要注意(如捕获屏幕),需要创建新的兼容 DC 和兼容位图进行使用。
另外一个可能不一致的原因是:捕获屏幕的位图是 32 位图,如果当作是 24 位位图处理将会与预期结果不一致。
下述例子演示了 VB6 使用 API 进行截图、以及使用 GetPixel 函数、GetDIBits 函数获取屏幕上 (0,0) 点的颜色值,以 16 进制表示
在例子中,使用了一个 PictureBox 控件用以便捷化保存截图,对象名为 picTmp
【第一部分】:声明 API、结构体和定义常量(略,参考 VB6 的 API 浏览器)
[ 函数声明 ]
BitBlt
CreateCompatibleBitmap
CreateCompatibleDC
GetCurrentObject
GetObject
GetObjectType
GetDIBits(注: lpBI As BITMAPINFO 改为 lpBI As Any)
GetDC
ReleaseD
SelectObject
DeleteObject
DeleteDC
GetPixel
SetPixel
CopyMemory
[ 结构体声明 ]
BITMAP
BITMAPINFOHEADER
RGBQUAD
BITMAPINFO
[ 常量定义 ]
OBJ_BITMAP
SRCCOPY
DIB_RGB_COLORS
BI_RGB
【第二部分】:实际函数
[ 窗体加载时对控件的调整 ]

[ 截图并保存到文件 ]

[ 获取 ( 0, 0 ) 点 RGB 颜色分量,以 16 进制表示 ]

[ 辅助函数 GetCR ,用以从指定位置获取指定颜色 ]

【演示】
将文件编译为 exe 后,先获取 ( 0, 0 ) 点 RGB 颜色分量,再进行截图
最后上传的图片就是截图的结果:


  • 自己的帐号ok
  • 啥也不懂
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
’pic1 通过 屏幕截屏bit方式获得 并隐藏
Picture2.Width = Picture1.Width
Picture2.Height = Picture1.Height '不一致 画面混乱
With Picture1
GetObject .Image, Len(PicInfo), PicInfo
BytesPerPixel = PicInfo.bmBitsPixel \ 8
ReDim PicBits(0 To PicInfo.bmWidth * PicInfo.bmHeight * BytesPerPixel)
GetBitmapBits .Image, UBound(PicBits), PicBits(1)
For I = 0 To UBound(PicBits) \ BytesPerPixel - 1
B = PicBits(I * BytesPerPixel + 0)
G = PicBits(I * BytesPerPixel + 1)
R = PicBits(I * BytesPerPixel + 2)
‘ r=1-------255
PicBits(I * BytesPerPixel + 0) = B
PicBits(I * BytesPerPixel + 1) = G
PicBits(I * BytesPerPixel + 2) = R
Next I
SetBitmapBits Picture2.Image, UBound(PicBits), PicBits(1)
Picture2.Refresh
End With


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 19回复贴,共1页
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示