VB用GetPixel屏幕取色的几个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB用GetPixel屏幕取色的几个问题相关的知识,希望对你有一定的参考价值。

1.GetPixel取色的坐标单位是像素吗?那对于不同分辨率的屏幕要想取同一个点的颜色怎么办?
2.用的GetDC 和GetPixel等API在屏幕取色 不知道为什么有的时候可以 但是偶尔会出错 返回-1,这是怎么回事?(我是对一个全屏运行的网络游戏取色。。。)
3.对于硬盘上的jpg图片,要用什么API可以对指定的点取色?得是在游戏全屏运行的时候也能取到的,像point,GetPixel这种如果程序窗口置顶可以取到,但是游戏全屏运行就取不到了。。哪位高手教下我,多谢了!如果能给我一段符合我要求的代码(最好有注释) 再追加50分

我不是太明确你第一个问题的意思。我的理解是你要对屏幕的某个目标进行取色。问题是如何确认这个目标的位置。如果目标是固定的坐标或者在固定的屏幕比例中出现,那么直接针对的计算坐标来取色即可。但我想你希望的是对一个不固定的坐标取色。那么多半是窗口坐标,这样的话可以获取窗口的DC来取色。总的来说,你必须确立一个参照坐标。
2,出错是因为并不是所有DC都支持GetPixel 和 SetPixel。例如win7的很多窗体,Java程序的窗体。不过DirectX的窗体好像是可以的。因为这个原因,考虑到兼容性需要,我往往是使用BitBlt来对一个像素点截屏再进行取色。一般来说BitBlt 不会让效率降低太多。可能几十倍而已,几千几百个点的话可以忽略。如果你是对大范围取色,BitBlt会比GetPixel更有效率。
3.读取jpg需要使用一些解码包会比较好,因为jpg的结构相当复杂,自己写代码会非常费事,事实上,我对JPG的结构还挺熟悉,但从来不敢想象自己写一个关于他的解压包。如果你是懒得找包的话,给你一个不太好的但可以处理的办法:使用JNI(Java native interface),他可以用作java 和c之间的界面, 由jdk自带。你可以在C里调度Java。java的 ImageIO.read(File file);方程可以直接读取bmp gif jpg 和 png 文件。读出来的BufferedImage 可以直接获取像素资料,但是效率不高,你可以从BufferedImage对象中获取 WritableRaster,然后获取DataBuffer 最后是直接的 byte 或者 int 数组数据。但是,前提是你要会JNI,同时JNI在C中调度Java的代码也是非常糟糕的,代码效率还可以,但代码会极度难看。如果真的决定使用JNI,那我建议你先用Java写一个 byte[] readJPG(String path);的方程然后再C调度这个方程获取 byte 数组,而不是直接从C调用ImageIO.read(),这样会省事非常多
但还是建议找C的解码包。给代码是不可能的,我原意话10分钟来回答问题,但不太原意话1小时来写代码。而且自己寻找答案会获得和学习更多。

最后如果你想要做的是图像识别,可以说jpg图片不是很好的选择,因为那是一种会丢失数据的文件格式,你用点对点的精确识别方法肯定(99.9999%)不能识别出图片。用模糊识别是要有很好的技术知识同时效率也会降低。建议使用BMP作为识别图片。BMP的解码包和源码网上一大堆。追问

大哥,一看你就是专业的,能给我大概说说怎么用BitBlt 取色么?我用GetPixel 确实在win7下失效。。。

参考技术A 游戏有保护取不到颜色

sketch里图片取色本可以这么快:Alembic

画插画的时候,看到一幅很漂亮的画,但是想提取主色的配色方案。于是就发现了这款插件。

经常逛 Dribbble ,Behance 等一系列设计网站的人,一定知道这些网站上总有一些的非常棒的配色。你也想在你的设计方案里去运用这些配色方案,这里就存在一个提取主色的问题。在 Dribbble Shot 的详情界面里,是提供了一个七种主色的色卡方便你使用,你可以点击查看 Hex 值,也可以直接使用拾色器来取色。不过这在 Alembic 插件面前都算不上方便,也算不上快捷。


Dribbble 色卡

Alembic 是一款 Sketch 的颜色类插件,它的作用只有一个:就是取出一张图片上的六种主色


sketch里图片取色本可以这么快:Alembic
Alembic 界面 @Github


它只有一个窗口,分成了七个部分,最大的矩形中用于显示你选择的图片图层;下面六个小方块用于显示图片中的六种主色。这里需要注意的时,Alembic 只会识别图片类的图层,当你点击 PNG 一类的位图图层时,它会自动识别主色;但你点击你绘制的矢量图层就是没有效果的。生成主色后,你可以直接点击色块,就可以将 Hex 数值复制到你的剪贴板上,再也不用多一步的点开拾色器去取色了。


Alembic 使用 @ Github


操作起来也非常的简单,你可以通过顶栏的 Plugins 菜单呼出它的主界面,也可以通过 Sketch Runner 输入插件的名称即可,同样的在安装时,除了 Github 下载,你一样也可以直接使用 Sketch Runner 的安装插件的功能搜索安装,相当的方便。


Alembic 呼出 @ Github


当然,可以选择 Sketch Runner 安装,也可以在阅读全文 下载。

祝开心

希望你也受用。



以上是关于VB用GetPixel屏幕取色的几个问题的主要内容,如果未能解决你的问题,请参考以下文章

神兵利器介绍一款支持屏幕录制滚动截图高清长图图片编辑图片转PDF格式屏幕取色的截图软件:FastStone Capture

sketch里图片取色本可以这么快:Alembic

win32gui.GetPixel() 不工作:pywintypes.error: (0, 'GetPixel', 'No error message is available')

前端工具---取色截图测量

如何使用python制作一款屏幕颜色提取器,附带exe文件

如何使用python制作一款屏幕颜色提取器,附带exe文件