| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 764 人关注过本帖, 3 人收藏
标题:截屏保存为bmp文件完整版mbpsaver
取消只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
结帖率:98.21%
收藏(3)
已结贴  问题点数:20 回复次数:3 
截屏保存为bmp文件完整版mbpsaver
感谢seasoners网友对我的代码感兴趣,给我动力,促使我重写这个程序,并在win7+vfp9下编译通过。

本源码仅供学习交流,如商用,请私信联系我,非常感谢!
程序代码:
***********************************************************************************************************
*!*    参考自己10几年前写的图片格式转换代码,重新编写这一段精简代码。
*!*    这是一个直接将截屏转换为黑白图片的演示程序,
*!*    运行本示例可以将截取_screen 的200 X 200 的区域,可以把程序中的200改成任何你想要的尺寸
*!*    也可以把你想要的尺寸再设置成2个参数。
*!*    并在你的默认目录中以文件名为testbw.bmp保存。
*!*    同理,稍加修改,它可以用在图片格式转换中,直接将彩图转换为黑白图片。
*!*    这个速度简直不要太快,就是不知道成图效果和挨个对图像数据流进行运算的二值化算法的效果一不一样?
*!*    当初VB代码是一个台湾人写的,可惜忘记他的网名了,在此表示感谢!
*!*    作者:Sam Jiang
*!*    时间:2023/09/06
*!*    1st revised: 2023/09/08 
*!*    修改内容:添加16色,256色,及灰阶图,真彩,全彩
*!*    改名为bmpsaver.prg
*!*    本程序在win7 和 vfp9.0(7423版)环境下编译通过
***********************************************************************************************************
PARAMETERS npara

DO case
    CASE npara=1 &&黑白
        nbitcount=1
        ccolortable=bintoc(0,"4rs")+bintoc(RGB(255,255,255),"4rs")
    CASE npara=2 &&16色
        nbitcount=4
        DIMENSION colors[16]
        colors[1]=RGB(0,0,0)
        colors[2]=RGB(0,0,191)
        colors[3]=RGB(0,191,0)
        colors[4]=RGB(0,191,191)
        colors[5]=RGB(191,0,0)
        colors[6]=RGB(191,0,191)
        colors[7]=RGB(191,191,0)
        colors[8]=RGB(191,191,191)
        colors[9]=RGB(64,64,64)
        colors[10]=RGB(0,0,255)
        colors[11]=RGB(0,255,0)
        colors[12]=RGB(0,255,255)
        colors[13]=RGB(255,0,0)
        colors[14]=RGB(255,0,255)
        colors[15]=RGB(255,255,0)
        colors[16]=RGB(255,255,255)
        ccolortable=""
        FOR i=1 TO 16
            ccolortable=ccolortable+BINTOC(colors[i],"4rs")
        ENDFOR
    CASE npara=3 &&256色
        nbitcount=8
        DIMENSION colors[256]
        i=0
        ccolortable=""
        FOR b=0 to 0xe0 step 0x20
            FOR g=0 to 0xe0 step 0x20
                FOR r=0 TO 0xc0 STEP 0x40
                    colors[i+1]=IIF(b=0xe0,0xff,b)*0x10000+;
                                IIF(g=0xe0,0xff,g)*0x100+;
                                IIF(r=0xc0,0xff,r)
                    ccolortable=ccolortable+BINTOC(colors[i+1],"4rs")
                    i=i+1
                ENDFOR
            ENDFOR
        ENDFOR
    CASE npara=4 &&256灰色
        nbitcount=8
        DIMENSION graycolors[256]
        ccolortable=""
        FOR i=0 TO 255
            graycolors[i+1]=RGB(i,i,i)
            ccolortable=ccolortable+BINTOC(graycolors[i+1],"4rs")
        ENDFOR        
    CASE npara=5 &&真彩
        nbitcount=24
        ccolortable=""
    CASE npara=6 &&全彩
        nbitcount=32
        ccolortable=""
    OTHERWISE 
        return .f.
ENDCASE

DO decl
obmiheader=NEWOBJECT([bmiheader],[myclass])
WITH obmiheader
    .bibitcount=nbitcount
    .biheight=200
    .biwidth=200
    .bisizeimage=CEILING(.biwidth/16)*2*.biheight
endwith    
lcbitmapinfoheader=obmiheader.getstruct()
hdc=getdc(_screen.HWnd)
hvdc=createcompatibledc(hdc)

if npara=1
    hbitmap=createbitmap(200,200,1,1,null)
ELSE
    hbitmap=createdibsection(hdc,lcbitmapinfoheader+ccolortable,0,null,0,0)
ENDIF

selectobject(hvdc,hbitmap)
=bitblt(hvdc,0,0,200,200,hdc,0,0,0x00cc0020)
n=getobjecta(hbitmap,0,null)
lcbitmap=REPLICATE(CHR(0),n)
GETOBJECTA(hbitmap,n,@lcbitmap)
obitmap=NEWOBJECT([bitmap],[myclass])
obitmap.set(lcbitmap)
m=obitmap.bmwidthbytes*obitmap.bmheight
lcbitmapdata=REPLICATE(CHR(0),m)
getbitmapbits(hbitmap,m,@lcbitmapdata)
x=CEILING(obitmap.bmwidthbytes/4)*4-obitmap.bmwidthbytes
lcbmpfdata=""
if x#0
    for i=1 to obitmap.bmheight
        lcbmpfdata=SUBSTR(lcbitmapdata,(i-1)*obitmap.bmwidthbytes+1,obitmap.bmwidthbytes)+REPLICATE(CHR(0),x)+lcbmpfdata
    ENDFOR
ELSE
    if npara=1
        lcbmpfdata=lcbitmapdata
    ELSE 
        for i=obitmap.bmheight to 1 step -1
            lcbmpfdata=lcbmpfdata+SUBSTR(lcbitmapdata,(i-1)*obitmap.bmwidthbytes+1,obitmap.bmwidthbytes)
        ENDFOR
    ENDIF             
ENDIF
        
bmpfile=NEWOBJECT("bmpfile","myclass")
WITH bmpfile
    .bitmapdata=lcbmpfdata
    .colortable=ccolortable
    WITH .bmfheader
        .bfoffbits=54+LEN(ccolortable)
        .bfsize=54+LEN(ccolortable)+LEN(lcbmpfdata)
    ENDWITH
    WITH .bmiheader    
        .bibitcount=nbitcount
        .biwidth=200
        .biheight=200
        .bisize=40
        .bisizeimage=LEN(lcbmpfdata)
        .bixpelspermeter=0
        .biypelspermeter=0
    ENDWITH    
ENDWITH
deletedc(hvdc)
deleteobject(hbitmap)
releasedc(_screen.hwnd,hdc)
bmpfile.save("testbw.bmp")
clea memory
release all


FUNCTION decl
    DECLARE integer GetObject IN WIN32API as getobjecta integer,integer,string
    DECLARE integer ReleaseDC IN WIN32API integer,integer
    DECLARE integer DeleteDC IN WIN32API integer
    DECLARE integer CreateBitmap IN WIN32API integer,integer,integer,integer,string
    DECLARE integer SelectObject IN WIN32API integer,integer
    DECLARE integer DeleteObject IN WIN32API integer
    DECLARE integer CreateCompatibleDC IN WIN32API integer
    declare integer CreateCompatibleBitmap in win32api integer,integer,integer
    DECLARE integer GetBitmapBits IN WIN32API integer,integer,string
    DECLARE integer CreateDIBSection IN WIN32API integer,string,integer,string,integer,integer
    DECLARE integer BitBlt IN WIN32API integer,integer,integer,integer,integer,integer,integer,integer,integer
    DECLARE integer GetDC IN WIN32API integer
    declare integer GetDIBits in win32api integer,integer,integer,integer,string,string,integer
ENDFUNC


黑白效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

16色效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

256色效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

灰阶效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

真彩效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

全彩效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2023-9-8 12:18编辑过]

收到的鲜花
  • kangss2023-09-08 15:27 送鲜花  1朵   附言:十分感谢!
搜索更多相关主题的帖子: integer string RGB case FOR 
2023-09-08 12:13
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
收藏
得分:0 
真彩和全彩效果一样,只是全彩可以设置透明度。
2023-09-08 12:21
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 9楼 吹水佬
​​Declare​​​​Function​​​​GdipCreateBitmapFromScan0 ​​​​Lib​​​​"gdiplus"​​​​(​​​​ByVal​​​​Width ​​​​As​​​​Long​​​​, ​​​​ByVal​​​​Height ​​​​As​​​​Long​​​​, ​​​​ByVal​​​​stride ​​​​As​​​​Long​​​​, ​​​​ByVal​​​​PixelFormat ​​​​As​​​​Long​​​​, scan0 ​​​​As​​​​Any, bitmap ​​​​As​​​​Long​​​​) ​​​​As​​​​GpStatus​​

这个scan0,有点头疼,是个指针,vfp里面处理好像比较麻烦。能不能详细介绍一下用法?网上搜的其他语言的毕竟看着有点吃力。
2023-09-09 20:13
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
收藏
得分:0 
是的,灰度图出错了。
2023-09-10 08:55
快速回复:截屏保存为bmp文件完整版mbpsaver
数据加载中...
 
   



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

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