VFP 图像比较!

yrt888 2012-02-01 03:41:29
以下代码是 dkfdtf 老师的截图程序:



DECLARE INTEGER FindWindow IN user32;
STRING lpClassName,;
STRING lpWindowName

DECLARE INTEGER GetDC IN user32 INTEGER hwnd

Declare SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect
DECLARE Long GetWindowDC IN WIN32API ;
Long hWnd
DECLARE Long ReleaseDC IN WIN32API ;
Long hWnd, Long hDc
DECLARE Long CreateCompatibleDC IN WIN32API ;
Long hDc
DECLARE Long DeleteDC IN WIN32API ;
Long hDc
DECLARE Long CreateCompatibleBitmap IN WIN32API ;
Long hDc, Long nWidth, Long nHeight
DECLARE Long BitBlt IN WIN32API ;
Long hDestDC, ;
Long nXDest, Long nYDest, Long nWidth, Long nHeight, ;
Long hSrcDC, ;
Long nXSrc, Long nYSrc, ;
Long dwRop
DECLARE Long SelectObject IN WIN32API ;
Long hDc, Long hObject
DECLARE Long DeleteObject IN WIN32API ;
Long hObject

DECLARE Long GdiplusStartup IN gdiplus ;
Long @ token, String @ inputbuf, Long @ outputbuf
DECLARE Long GdiplusShutdown IN gdiplus ;
Long token
DECLARE Long GdipCreateBitmapFromHBITMAP IN gdiplus ;
Long hbitmap, Long hpalette, Long @ hGpBitmap
DECLARE Long GdipDisposeImage IN gdiplus ;
Long image
DECLARE Long GdipSaveImageToFile IN gdiplus ;
Long nImage, String FileName, ;
String clsIdEncoder, Long encoderParams

#define SRCCOPY 0x00CC0020

LOCAL cFileExtName, cEncoder, iInputBuf, iResult
LOCAL hDesktopDc, hVDc, hBitmap, hToken, hGdipBitmap
m.hWnd=FindWindow("Notepad",NULL) &&截取一个文本窗口试一试
tcFile=LOWER('I:\TUT.JPG') &&jpg 格式图像
m.cFileExtName =LOWER( JUSTEXT( m.tcFile ))
lpRect = REPLI (Chr(0), 16)
GetWindowRect (m.hWnd, @lpRect)
lnWidth=ctob(SUBS(lpRect,9,4),'4rs')-ctob(SUBS(lpRect,1,4),'4rs')&&窗口宽度
lnHeight=ctob(SUBS(lpRect,13,4),'4rs')-ctob(SUBS(lpRect,5,4),'4rs')&&窗口高度

m.hDesktopDc = GetDC( m.hWnd )
m.hVdc = CreateCompatibleDC( m.hDesktopDc )
m.hBitmap = CreateCompatibleBitmap( m.hDesktopDc,10,10 )
SelectObject( m.hVdc, m.hBitmap )
*BitBlt( m.hVdc, 0,0,10,10, m.hDesktopDc,283,563, SRCCOPY )

m.hToken = 0
m.iInputBuf = 0h01 + REPLICATE( CHR(0),15 )
m.iResult = -1
IF ( 0 == GdiplusStartup( @ m.hToken, @ m.iInputBuf, 0 ))
m.hGdipBitmap = 0
IF ( 0 == GdipCreateBitmapFromHBITMAP( ;
m.hBitmap, 0, @ m.hGdipBitmap ))
m.cEncoder = ICASE( ;
'jpg' == m.cFileExtName, 0h01, ;
'gif' == m.cFileExtName, 0h02, ;
'tif' == m.cFileExtName, 0h05, ;
'png' == m.cFileExtName, 0h06, 0h00 ) ;
+ 0hF47C55041AD3119A730000F81EF32E
m.iResult = GdipSaveImageToFile( ;
m.hGdipBitmap, ;
STRCONV( m.tcFile+CHR(0), 5 ), ;
m.cEncoder, 0 )
GdipDisposeImage( m.hGdipBitmap )
ENDIF
GdiplusShutdown( m.hToken )
ENDIF

DeleteObject( m.hBitmap )
DeleteDC( m.hVdc )
ReleaseDC( 0, m.hDesktopDc )


这样就可以截图屏幕上的某一区域的图像!

现在是想用这个刚截取的图像和现有的图像进行比较是否相同,我的方法是用FILETOSTR() 把图像转化为字符串,然后作比较!
现在是截图后要保存图像,能不能不用保存图像,在内存中把图像转为FILETOSTR()那样的字符串,这样就可以省却保存图像这一步了!(或者其他方法也行),看看上面代码 在那里就可以进行了,我就看不懂!谢谢!
...全文
400 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lygcw9602 2012-02-13
  • 打赏
  • 举报
回复
lygcw9602 2012-02-13
  • 打赏
  • 举报
回复
123456
yrt999 2012-02-12
  • 打赏
  • 举报
回复
研究了GetDIBits 一段时间 发现第六个参数较复杂 先不管了 先结贴 有补充的可以继续 先谢谢!
yrt888 2012-02-03
  • 打赏
  • 举报
回复
我现在的图像比较是用 GetPixel 取的点数是 90*6*9 这么多点 也是零点几秒就完成了,可是将来要取更多的点 就估计稍慢了 于是想到用其他方法!
yrt888 2012-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 apple_8180 的回复:]
如果格式是一样的:
我还是建议你截图保存图像后,再 Filetostr 比较吧。
还是这样最方便。
[/Quote]

我也是这样想的,就是想有没有办法不用保存,省却一步,保存到磁盘,应该拖慢了时间,谢谢!
十豆三 2012-02-03
  • 打赏
  • 举报
回复
如果格式是一样的:
我还是建议你截图保存图像后,再 Filetostr 比较吧。
还是这样最方便。
yrt888 2012-02-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ydks_qz 的回复:]
涉及到图像格式的问题吧?如果两张图像的格式是不一致则 FileToStr 也无法比较。但是如果可以通过将两种图片都载入到 DC 或 Mem DC 中进行比较,则 GetDIBits 可以做到;再如果比对速度完全不必考虑,也可以对两张图片的 DC 做 GetPixel 逐点进行比较。每个点的颜色都相同,则认为两张图片是相同的。
[/Quote]

格式是一样的 都是同一方法截图,速度当然是首要考虑了,看看老师你的GETDIBITS 是怎样的,谢谢!我的FILETOSTR 就是想简单而快速比较 GETPIXEL 相对较慢,谢谢!我的图像都是几十乘几十像素的!谢谢你!
yrt888 2012-02-03
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20070328/15/8f59f667-3e30-48a8-a9f3-2c728e6c3f12.html
这个是刚找到的 版主的帖子 里面有 GetDIBits 正看得忙乱 慢慢来!

关键就是 第五和第六个参数 里面估计有可用的东西!
ydks_qz 2012-02-02
  • 打赏
  • 举报
回复
涉及到图像格式的问题吧?如果两张图像的格式是不一致则 FileToStr 也无法比较。但是如果可以通过将两种图片都载入到 DC 或 Mem DC 中进行比较,则 GetDIBits 可以做到;再如果比对速度完全不必考虑,也可以对两张图片的 DC 做 GetPixel 逐点进行比较。每个点的颜色都相同,则认为两张图片是相同的。
yrt888 2012-02-01
  • 打赏
  • 举报
回复
在网上也找不到 相关资料 看来确实难,暂且观望一下!
十豆三 2012-02-01
  • 打赏
  • 举报
回复
应该是不可以,因为如果可以的话,就直接 Strtofile 来生成图片,何必用后面的
GdiplusStartup
GdipSaveImageToFile
GdipCreateBitmapFromHBITMAP

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧