设为首页收藏本站官方微博

【汉化资料】VC实现屏幕上图像比对

[复制链接]
查看: 1402|回复: 0
打印 上一主题 下一主题

【汉化资料】VC实现屏幕上图像比对

跳转到指定楼层
楼主
发表于 2009-5-24 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】VC实现屏幕上图像比对

原文
+ U, I* }2 {# Y: Uhttp://tech.techweb.com.cn/redir ... 4&goto=lastpost; |4 a( t* e( p% _8 f: X/ v
" }5 T1 L; J/ V. h. I2 I
8 \$ I% v) v8 e7 u! D
我现在的情况是学会用VC和MFC没有多久,也大致看过Windows图形基础(包括GDI结构和一些绘制函数),有过Win32 SDK开发经历,来这里请教下大家关于如何进行屏幕上图像比对的原理和具体的方法,我总结了一下基本就是以下两个方面的问题。
, U* u* H3 {! E% P( k6 N2 O, T) N" ~9 }5 X! F) J2 q
第一种情况是要对屏幕上某个区域进行截图,得到图像后再和事先存在本地的一个图象数据比较,当然肯定事先存放的这个图象和屏幕上取得的这个图像,大小,内容这些都是完全一致的,问下这个实现原理是怎么样的,实现过程的话,是把屏幕上获得的内存数据保存为图片文件再和本地的图片文件比较好?还是把本地的图片文件加载到内存中去和屏幕上取的内存数据进行比较好?
5 w5 W9 B1 `- q. W% C
5 H0 S( J$ S1 W第二种情况,针对屏幕上的某些图像比如前景是数字,样式颜色等都是固定不变的,但是图象背景有可能是动态变化的,这样的情况又应该怎样进行比对了? ( e$ M0 ?" X- S. @
% F  K5 G$ a2 `) u  {! t
先在这里谢谢来回复提供帮忙的朋友了,提供实现原理,具体实现代码和相关资料的都非常感谢。 + i- X8 A. J8 O7 S/ ^. m6 |! R  R

! p% O+ P5 B; ~- w收藏 分享 评分
6 q6 x! w; Y7 D0 h
7 M3 I! }; m( Q 回复 引用 订阅 TOP 5 @3 v% ^$ v  n- t& H) H6 v
. Z3 y! H) Y8 {5 u" p6 G
  5 ]* O4 N$ d" H+ t
5 M; L' [& v1 `
xiaojj 发短消息
% K! ]. d/ [. r" {5 D3 m0 t加为好友 4 u0 M" S7 K8 D, ]3 l" b7 t
xiaojj 当前离线 ) `  \: z+ K! [$ m

, Y; ~7 {. H+ ~& }4 EUID168050 帖子157 精华34 积分703 阅读权限50 在线时间13 小时 注册时间2009-4-27 最后登录2009-5-22  0 w; {9 {! g6 q$ N# F' K* b
TW高级会员
! y9 U3 C. [! Y$ E4 @0 B/ o" H. m9 T0 ]& W$ Y1 \0 J

9 k: Q' ?, ~/ I: N  l1 | 2#
! [" i+ B' E1 z  `" G9 N* ~  ^8 w) D 发表于 2009-5-5 10:47 | 只看该作者 不好意思,对不住大家了,按发帖太快了
8 ]' B+ X# l# r; I% m! Q ' W0 f  l  ]( w( L1 [1 h
回复 引用 TOP
1 s. u$ c* Z5 q* b8 r# U8 W " D. Q- U. a7 g: K( }' L( T
  
2 e( G0 @) `" X7 P7 z- n$ w3 I6 s/ m& e$ |7 C7 }) s6 E# a
xiaojj 发短消息
* c5 N! r; V6 ]# ^加为好友 . ?' c8 P4 `1 f9 J. f
xiaojj 当前离线 7 `9 I6 y% E+ n/ Z8 L% g+ ^
& }% {* @$ w3 h: u5 b
UID168050 帖子157 精华34 积分703 阅读权限50 在线时间13 小时 注册时间2009-4-27 最后登录2009-5-22  
: D* |- {5 P3 ^TW高级会员) H! T/ ?6 a( I" v' {+ L
4 N4 q& _1 ~8 L
' y  C' ~7 \- e$ c  w: m$ z  o
3# $ L7 n9 F- e% W7 P5 Z) J8 F* ?
发表于 2009-5-5 10:47 | 只看该作者 希望大家指教,有熟悉这个朋友麻烦回复下吧,谢谢。
2 W: d' K* _+ D6 f/ P5 D
& [7 m5 e; B$ R  Z 回复 引用 TOP
- H( r$ t& \' M6 b% ^0 {/ t& ~ 3 s4 Y0 E! R; g; @& z
  3 o6 N% p6 _, N5 \

% M& C' c) d2 o游客  4#
1 j3 @, N/ a$ q 你想要得到什么形式的对比结果?
( V! e  o  O# i/ ~3 ^9 o0 n6 T: n
) V9 Y. A, _6 d; f; l' B  e 回复 引用 TOP 2 S) K$ Y. @' |) Z7 h  ~3 X

, A4 g# o# |+ c! _2 x" Z  
1 |8 J+ p' {& [3 u
) L7 `8 T  [* oxiaojj 发短消息   ^  G0 M; ~' b/ s# z/ g( D
加为好友 # a6 V9 c1 @8 b
xiaojj 当前离线 ! A8 a3 c6 `3 x0 b) P& U
6 Q6 H* G- q% s
UID168050 帖子157 精华34 积分703 阅读权限50 在线时间13 小时 注册时间2009-4-27 最后登录2009-5-22  0 d2 g7 y% L/ e: Q' y7 ^
TW高级会员
9 F# d0 ~# K1 d2 n3 Q" K0 R- F3 g4 h% y5 @2 V
3 f6 T0 e$ c' @
5# # S" N" G2 V8 [8 \  x+ n* @
发表于 2009-5-5 10:48 | 只看该作者 打个比方,就是比如我将屏幕的某个区域先截图下来,然后屏幕在没有任何变化情况下,取同样的区域图像和这个事先截好的图比较,一致就行了。反过来说,如果第一次截图的时候光标不在这个区域中,然后第二次做比对的时候,正好光标移动到过这个区域中,这就叫不一致了。
( [* G0 S$ A6 W2 l2 p2 i/ k8 _% q. X5 U9 ]; W5 b) `* \5 s' O. q$ h( N. {6 h/ K5 Y0 n4 t
不知道大家理解到没有,谢谢大家回复。 # A* K6 g6 a$ F; G- b0 e  J

$ G2 h6 w. B8 C3 {$ \ 回复 引用 TOP 3 S; y9 K6 R: d" k$ d4 K

% [9 i. O" F* z/ `2 O9 n  - _% k+ f7 K5 D
3 K/ T7 V+ B- K( C% Z
游客  6#
! ~" i- O5 W7 k3 P BitBlt()函数有位图异或功能  
3 p' U5 X; R9 r将一个位图用BitBlt的异或方式画到另一个位图上,结果就是异或的。如果两幅图像是完全一样的,异或出来则是一个空的BYTE数组,图标被使用BYTE的数组方式进行比较
8 u7 L. y; c, x4 z' x- o) @3 s) b) A- b- q4 i) ?" c2 p

9 H* l7 d" R6 K! S7 s( B9 k, AC/C++ code
) K: i  C2 }& {) Z$ H( `: _3 |          BYTE   *lpDib;   
- m5 c- |5 o1 [' ~/ f7 _4 K          BYTE   *lpBase;             - K. t5 X1 p+ H$ J
          BITMAPINFOHEADER   bi;           
, T+ i0 H) T. r# _* j! }          DWORD     dwLen;   
, t% h) y5 W7 }+ w& w3 I          DibInfo   (Orghdib,   &bi);   
) W5 _+ m' K7 h          dwLen       =   GlobalSize   (Orghdib);   9 e3 m) x. t$ T4 Y1 j) F  s
  lpDib       =   (BYTE   *)GlobalLock(Orghdib);   - j9 j* S) k* j; D
          lpDib     +=   (DWORD)bi.biSize   +   PaletteSize((LPSTR)&bi);   , x0 ^9 K9 W0 U' @! a: o7 k/ j
  lpBase     =   (BYTE   *)GlobalLock   (Tarhdib);   ; H& x6 A/ g3 J# Y  _
          lpBase   +=   (DWORD)bi.biSize   +   PaletteSize((LPSTR)&bi);   ' |1 y' a7 F" f# e/ S4 Q- @
  dwLen       =   dwLen   -   bi.biSize   -   PaletteSize((LPSTR)&bi);   8 t5 O/ q+ O* T& p7 U
          while   (dwLen--)     
6 y7 T8 Z) C1 I  y1 t- D+ {  {/*   # @6 |* B5 u* \, e
          if(   *lpDib   >=   (int)(debasehow*(*lpBase))   )   
' O( N+ M6 a+ w; v          *lpDib   -=   (int)(debasehow*(*lpBase));   
8 C( i, Q5 P+ {; H          else   
3 ?+ G% V6 ^. S$ Y8 ?+ J          *lpDib   =   0; */   ' P+ l3 _5 X+ _0 R
  在本处加入异或操作:   *lpDig   ^=   lpBase;   , {6 g5 K" g& q0 q5 U. v: z
          lpDib   ++;   ' k2 Y$ d: k7 E) `+ F
          lpBase   ++;   
* s. D  ^3 c3 `* g          }   
( H$ ?0 N8 v$ X5 l          GlobalUnlock   (Orghdib);   " f0 S4 u/ n6 |+ J8 |! R/ S
          GlobalUnlock   (Tarhdib);     t" O  S2 ?/ H+ Z2 B% m4 t

) b; v8 x; V, f- Y/ s
  w6 R# ]7 L  O* `
! s0 s3 f% r4 W8 J9 x, b- i5 z% x  |2 G6 m$ @6 y
最后看lpDig的值就行了
+ H: J/ R# V: A) p ) ]0 T- P5 h: {$ A( A  Z8 y
回复 引用 TOP
6 e0 h6 \8 ]6 |3 K2 w6 W: B) Q' J% B
. Q, b; T9 y4 ]6 K  U) M2 }, J  1 K. L+ ?9 [5 J2 |

2 ]: x  {9 Z+ M3 v3 b; \# B+ R游客  7# 4 J3 _$ o  F9 `' o& R
说到鼠标光标,我记得利用桌面DC是无法获取到的。不过可以用取巧的方法得到。 * c4 R4 b$ s* ?, t1 s" k

/ D4 w/ J) v" h7 e  ^$ p 回复 引用 TOP 9 @- m; q9 a; u- y- \

# A0 g; i& T: h1 e  
6 M! b4 }  |" [- \9 n1 E  I7 z9 c9 A$ o# T" ]# X4 d9 ?2 ]
游客  8# 7 `' K& s1 l3 E
感谢6楼说了第一种情况的方法,我再去查查资料看看,另外现在第二种情况比较用什么方法了?就是屏幕中某个区域会显示文字,文字的颜色是固定的,但是文字背景图像是不固定的,这种情况只需要比对事先截的图像和现在屏幕中的区域图像大小一致,然后文字一致就可以,不用比较背景,该怎么做了? ; G: g: }/ m- M( {- B; F

* W) Y2 s" Z' m3 ?  C 回复 引用 TOP % k& p# O! u0 z

3 }; Q: ~* {8 w% ~% |: U  % {0 w; _1 E4 o$ r5 O
1 b& l4 n$ P- ^3 _! R; l6 @' J
游客  9# 3 _$ |" s% D: x
没有好办法,只能先在固定的区域把文字颜色的像素点抠出来,然后再记录、比对。
) ?0 o( X# i% B' U2 P  h
  Y# s  `6 U! X- j0 y( p 回复 引用 TOP
' t6 q6 z" I/ g0 H3 z" _# n0 w
+ c/ J" t: {' x  7 i; Z1 l( Y* F2 ~2 L% j1 m
6 w) N7 n. d/ S5 c
游客  10#
* F3 T6 M  \4 b3 l) [ 如果只是要判断图象是否相同,在截取图象之后,取得像素数据,然后用memcmp比较就行了。 : d$ V; i2 K9 Y; U1 n
0 W& T* d) @& _" _8 S$ D
回复 引用 TOP
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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