#2
sam_jiang2023-09-08 12:21
|
本源码仅供学习交流,如商用,请私信联系我,非常感谢!
程序代码:
***********************************************************************************************************
*!* 参考自己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编辑过]