| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 939 人关注过本帖, 3 人收藏
标题:截屏保存为bmp文件完整版mbpsaver
只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:806
专家分:1231
注 册:2021-10-13
结帖率:96.83%
收藏(3)
已结贴  问题点数:20 回复次数:15 
截屏保存为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
帖 子:806
专家分:1231
注 册:2021-10-13
收藏
得分:0 
真彩和全彩效果一样,只是全彩可以设置透明度。
2023-09-08 12:21
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
谢谢!
2023-09-08 14:59
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:277
专家分:615
注 册:2014-6-12
收藏
得分:0 
十分感谢!
2023-09-08 15:26
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:334
专家分:810
注 册:2021-1-9
收藏
得分:0 
2023-09-08 18:27
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:309
专家分:711
注 册:2021-11-24
收藏
得分:0 
2023-09-08 21:21
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
2023-09-08 21:42
pvm2000
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:180
专家分:312
注 册:2022-12-22
收藏
得分:0 
辛苦
2023-09-08 23:55
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
试试用 GdipCreateBitmapFromScan0(),看效果如何

支持以下常量指定位图中使用的各种像素格式。

PixelFormat1bppIndexed = 196865
PixelFormat4bppIndexed = 197634
PixelFormat8bppIndexed = 198659
PixelFormat16bppGrayScale = 1052676
PixelFormat16bppRGB555 = 135173
PixelFormat16bppRGB565 = 135174
PixelFormat16bppARGB1555 = 397319
PixelFormat24bppRGB = 137224
PixelFormat32bppRGB = 139273
PixelFormat32bppARGB = 2498570
PixelFormat32bppPARGB = 925707
PixelFormat48bppRGB = 1060876
PixelFormat64bppARGB = 3424269
PixelFormat64bppPARGB = 29622286
PixelFormatMax = 15

常量
PixelFormat1bppIndexed 指定格式为每像素1位,进行索引。
PixelFormat4bppIndexed 指定格式为每像素4位,进行索引。
PixelFormat8bppIndexed 指定格式为每像素8位,进行索引。
PixelFormat16bppARGB1555 指定格式为每像素16位; 1位用于alpha分量,每个5位用于红色,绿色和蓝色分量。
PixelFormat16bppGrayScale 指定格式为每像素16位灰度。
PixelFormat16bppRGB555 指定格式为每像素16位;每个5位用于红色,绿色和蓝色组件。剩余的位不被使用。
PixelFormat16bppRGB565 指定格式为每像素16位;红色分量使用5位,绿色分量使用6位,蓝色分量使用5位。
PixelFormat24bppRGB 指定格式为每像素24位;每个8位用于红色,绿色和蓝色组件。
PixelFormat32bppARGB 指定格式为每像素32位;每个8位用于alpha,red,green和blue组件。
PixelFormat32bppPARGB 指定格式为每像素32位;每个8位用于alpha,red,green和blue组件。红色,绿色和蓝色组件根据Alpha组件预乘。
PixelFormat32bppRGB 指定格式为每像素32位;每个8位用于红色,绿色和蓝色组件。剩余的8位不被使用。
PixelFormat48bppRGB 指定格式为每像素48位;红色,绿色和蓝色组件都使用16位。
PixelFormat64bppARGB 指定格式为每像素64位; 16位用于alpha,red,green和blue组件。
PixelFormat64bppPARGB 指定格式为每像素64位; 16位用于alpha,red,green和blue组件。红色,绿色和蓝色组件根据Alpha组件预乘。

备注
PixelFormat48bppRGB,PixelFormat64bppARGB和PixelFormat64bppPARGB每个颜色组件(通道)使用16位。Microsoft Windows GDI+版本1.0可以读取每通道16位图像,但是这些图像将被转换为每通道8位格式进行处理,显示和保存。
2023-09-09 17:40
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 9楼 吹水佬
@吹版主,可否给一点示例,谢谢!
2023-09-09 18:36
快速回复:截屏保存为bmp文件完整版mbpsaver
数据加载中...
 
   



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

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