| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2406 人关注过本帖, 1 人收藏
标题:跪求:如何用VFP实现在全屏中找图的功能。
只看楼主 加入收藏
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
以下是引用JHKCHEN在2012-12-14 22:38:34的发言:

本人研究了以下,vfp调用API恐难实现此功能
换个思路:假设有d:\1.bmp,如果能将该BMP的每一个点的BGR值存到一个数组中
就能实现此在全屏中找1.BMP是否存在的功能。
请高手指点如何将d:\1.bmp,如果能将该BMP的每一个点的BGR值存到一个数组中?

将BMP的每一个点的BGR值存到一个数组中
程序代码:
gnbmpfile=FOPEN("abc.bmp")&&&打开bmp文件
=FSEEK(gnbmpfile,10)
a=CTOBIN(FREAD(gnbmpfile,4),"s")
START=trueshi(a)&&&bmp文件像素开始处
=FSEEK(gnbmpfile,18)
a=CTOBIN(FREAD(gnbmpfile,4),"s")
bwidth=trueshi(a)&&&&图片宽
a=CTOBIN(FREAD(gnbmpfile,4),"s")
bheight=trueshi(a)&&&&图片高
=FSEEK(gnbmpfile,28)
a=CTOBIN(FREAD(gnbmpfile,2),"s")
IF a<>6144&&&检测是否为24位图片
    MESSAGEBOX("此图不是真彩色图片")
    RETURN
ENDIF
=FSEEK(gnbmpfile,START)
DIMENSION yanse(bwidth,bheight)&&&定义数组
****将颜色储存于数组中
FOR ii=1 TO bwidth    
    FOR jj=1 TO bheight
    r=CTOBIN(FREAD(gnbmpfile,1),"s")
    g=CTOBIN(FREAD(gnbmpfile,1),"s")
    b=CTOBIN(FREAD(gnbmpfile,1),"s")
    yanse(ii,jj)=trueyanse(a,b,c)
    ENDFOR
    endfor
=FCLOSE(gnbmpfile)
***将数组输出到文本文件
DISPLAY MEMORY LIKE yanse TO FILE yanse.txt noconsole
***打开文本文件
MODIFY FILE yanse.txt
****自定义函数,将十进制数进行反转
FUNCTION trueshi(shi)
shiliu=TRANSF(shi,"@0x")
shi1=SUBSTR(shiliu,3,2)
shi2=SUBSTR(shiliu,5,2)
shi3=SUBSTR(shiliu,7,2)
shi4=SUBSTR(shiliu,9,2)
shiliu="0x"+shi4+shi3+shi2+shi1
trueshi=&shiliu
RETURN trueshi
ENDFUNC
****自定义函数,将rgb保存为数字,减少占内存。
FUNCTION trueyanse(r,g,b)
shi1=SUBSTR(TRANSF(r,"@0x"),9,2)
shi2=SUBSTR(TRANSF(g,"@0x"),9,2)
shi3=SUBSTR(TRANSF(b,"@0x"),9,2)
shiliu="0x00"+shi3+shi2+shi1
trueshi=&shiliu
RETURN trueshi
ENDFUNC

坚持学习vfp,QQ:306805680
2012-12-15 15:01
JHKCHEN
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2011-5-31
收藏
得分:0 
感谢高手们,可我用了FOPEN()和Fread()等低级读取的方法,读出的是乱码,如何转换成能看得懂的bmp文件存储格式呢?

请高手指点。
2012-12-16 23:48
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
回复 12楼 JHKCHEN
仔细看看ctobin()函数的用法,可以把二进制数据转化为数值型的数据,然后再通过转换,就可以读懂乱码了。

坚持学习vfp,QQ:306805680
2012-12-17 11:09
JHKCHEN
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2011-5-31
收藏
得分:0 
回复 11楼 月沐庭轩
感谢您的帮助,我已实现将BMP的每一RBG的16进制存到数组中,
你写的这段有些小问题,相互交流。
因24位的RBG 要占3个字节,如BMP宽度*3/4<>0 那WINDOWS存储时要会补足,故如果直接从RBG数据区一直读取到结束BMP会失真。
还有1、按BMP宽度读取时每一行的RGB头和尾6个字节没有用(它是图像的左右边框)。2、按BMP宽度读取时第一行的RGB是没有用的(它是图像的底边框)。

IF 宽度*3/4=0 THEN
FSEEK(BMPHANGLE,54&&START + 宽度*3 + 3&&倒数第一行的坐边框占得3个字节)
FREAD()&&真正有效的RGB开始处,以后按(宽度-2)完后 让FSEEK移动6个字节。
else
FSEEK(BMPHANGLE,54&&START + 宽度*3 + 3&&WINDOWS补得3个字节 + 3&&倒数第一行的坐边框占得3个字节)
FREAD()&&真正有效的RGB开始处,以后按(宽度-2)完后 让FSEEK移动9个字节。
ENDIF

如本人有错,请指导。
请高手指导VFP 如何实现截屏和指定区域截屏?
2012-12-18 23:23
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
将你的代码完全贴出来,共享一下吧。
第55字节是像素颜色的开始处,你的那个语句,怎么都是第55字节?我没有看懂。
我那代码,其实start应该就是54的。如果是其他的,就会退出,因为不是真彩色图片了。

坚持学习vfp,QQ:306805680
2012-12-19 11:02
nmhfs
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2012-11-8
收藏
得分:0 
关注
2012-12-19 11:33
快速回复:跪求:如何用VFP实现在全屏中找图的功能。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018170 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved