在VB6中保存单色(1Bit)位图(VB6代码)

程序代码: 
Option Explicit

Private Const DIB_RGB_COLORS As Long = 0
Private Const SRCCOPY As Long = &HCC0020
Private Const BI_RGB As Long = 0&

Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type

Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type

Private Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Declare Function CreateCompatibleDC Lib "gdi32.dll" ( _
     ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" ( _
     ByVal hdc As Long, _
     ByVal nWidth As Long, _
     ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" ( _
     ByVal hdc As Long, _
     ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" ( _
     ByVal hDestDC As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal nWidth As Long, _
     ByVal nHeight As Long, _
     ByVal hSrcDC As Long, _
     ByVal xSrc As Long, _
     ByVal ySrc As Long, _
     ByVal dwRop As Long) As Long
Private Declare Function GetDIBits Lib "gdi32.dll" ( _
     ByVal aHDC As Long, _
     ByVal hBitmap As Long, _
     ByVal nStartScan As Long, _
     ByVal nNumScans As Long, _
     ByRef lpBits As Any, _
     ByRef lpBI As BITMAPINFO, _
     ByVal wUsage As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" ( _
     ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" ( _
     ByVal hObject As Long) As Long
Private Declare Function GetBitmapObject Lib "gdi32" Alias "GetObjectA" ( _
    ByVal hBitmap As Long, _
    ByVal cbBuffer As Long, _
    ByRef destBmp As Any) As Long

Private Sub SavePictureBW(ByVal ctrl As PictureBox, ByVal destfile As String)
    Dim hdcMono As Long, hbmpMono As Long, hbmpOld As Long, dxBlt As Long, dyBlt As Long, success As Long
    Dim numscans As Long, byteswide As Long, totalbytes As Long, lfilesize As Long
    Dim bmpsrc As BITMAP, bmpdst As BITMAP
    Dim bInfo As BITMAPINFO
    Dim bitmaparray() As Byte, fileheader() As Byte
    Dim ff As Integer, by8
    
    'Object's scalemode must be Pixel.
    dxBlt = ctrl.ScaleWidth
    dyBlt = ctrl.ScaleHeight
    
    'Create monochrome bitmap from control.
    hdcMono = CreateCompatibleDC(0)
    hbmpMono = CreateCompatibleBitmap(hdcMono, dxBlt, dyBlt)
    success = GetBitmapObject(hbmpMono, Len(bmpsrc), bmpsrc)
    hbmpOld = SelectObject(hdcMono, hbmpMono)
    success = BitBlt(hdcMono, 0, 0, dxBlt, dyBlt, ctrl.hdc, 0, 0, SRCCOPY)
    
    'Calculate array size needed for bitmap bits (dword aligned)
    numscans = dyBlt
    by8 = dxBlt / 8
    If (dxBlt Mod 8) = 0 And (by8 Mod 4) = 0 Then
       byteswide = by8
    Else
       byteswide = (Int(by8) + 4) - (Int(by8) Mod 4)
    End If
    totalbytes = numscans * byteswide
    ReDim bitmaparray(1 To totalbytes)
    
    'Set BITMAPINFO values to pass to GetDIBits function.
    With bInfo
       .bmiHeader.biSize = Len(.bmiHeader)
       .bmiHeader.biWidth = bmpsrc.bmWidth
       .bmiHeader.biHeight = bmpsrc.bmHeight
       .bmiHeader.biPlanes = bmpsrc.bmPlanes
       .bmiHeader.biBitCount = bmpsrc.bmBitsPixel
       .bmiHeader.biCompression = BI_RGB
    End With
    
    success = GetDIBits(hdcMono, ctrl.Image, 0, numscans, bitmaparray(1), bInfo, DIB_RGB_COLORS)
    
    'bitmaparray should now contain bitmap bit data. Now create bitmap file header.
    ReDim fileheader(1 To &H3E)
    fileheader(1) = &H42 'B
    fileheader(2) = &H4D 'M
    lfilesize = UBound(fileheader) + UBound(bitmaparray)
    fileheader(3) = lfilesize And 255
    fileheader(4) = (lfilesize \ 256) And 255
    fileheader(5) = (lfilesize \ 65536) And 255
    fileheader(6) = (lfilesize \ 16777216) And 255
    fileheader(11) = &H3E 'offset
    fileheader(15) = &H28 'size of bitmapinfoheader
    fileheader(19) = dxBlt And 255
    fileheader(20) = (dxBlt \ 256) And 255
    fileheader(21) = (dxBlt \ 65536) And 255
    fileheader(22) = (dxBlt \ 16777216) And 255
    fileheader(23) = dyBlt And 255
    fileheader(24) = (dyBlt \ 256) And 255
    fileheader(25) = (dyBlt \ 65536) And 255
    fileheader(26) = (dyBlt \ 16777216) And 255
    fileheader(27) = 1
    fileheader(29) = 1
    fileheader(35) = UBound(bitmaparray) And 255
    fileheader(36) = (UBound(bitmaparray) \ 256) And 255
    fileheader(37) = (UBound(bitmaparray) \ 65536) And 255
    fileheader(38) = (UBound(bitmaparray) \ 16777216) And 255
    fileheader(47) = 2
    fileheader(51) = 2
    fileheader(59) = &HFF
    fileheader(60) = &HFF
    fileheader(61) = &HFF
    
    ff = FreeFile
    Open destfile For Binary Access Write As #ff
       Put #ff, , fileheader
       Put #ff, , bitmaparray
    Close #ff
    
    ' Clean up
    Call SelectObject(hdcMono, hbmpOld)
    Call DeleteDC(hdcMono)
    Call DeleteObject(hbmpMono)
End Sub

Private Sub Command1_Click()
    Call SavePictureBW(Picture1, "d:\123.bmp")

摘自: http://blog.m5home.com/article.asp?id=504


VB部分相关推荐

VB快速读取 TextBox N 行的资料

VB禁止使用 Alt-Tab Ctrl-Alt-Del

生成迷宫的程序

另一方法转换大小写

VB控件注册 - 利用资源文件将dllocx打包进exe文件

VB利用资源文件进行工作

[]vb高效编程(优化)

VB阳历转阴历

VB代码取得硬盘的物理序列号

VB获得磁盘的文件系统

VB的,经常注册和反注册OCX控件和DLL

VB从程序中生成Exe文件

VB6监视/操作剪贴板示例(VB6.0代码)

VB6里自动提交/自动填表的一种相对通用的方案

VB移动没有标题的窗体

VB随机字母的函数

VB删除带子文件夹和文件的文件夹

VB怎样屏蔽 Alt+F4

VB 隐藏进程

vb屏蔽文本框点右键时的弹出菜单

VB手控Combobox的打开或收起

VBINI文件的读写、删除(对中文支持很好)

vb全局热键的写法(占很少的资源)

vb取消文本框的粘贴功能

VB常用文件操作类

VB获取特殊文件夹

VB获取windows各常用目录的函数(模块)

VB生成太极图

VB:常用内部函数大全,你会了几个呢?

vbSendMessage函数

精简VB程序的代码

VB:将数字转换为大写中文

VB:设定 MsgBox 在若干时间之后若无回应则自动关闭

VB:读取及设定NumLock/CapsLock/ScrollLock的值

VB:您知道 Mid$ 函量可以放在 '=' 的左方吗

VB后台获得按键,并执行自己的函数(非钩子及热键)

VB:将短文件名格式转成长文件名

vb中使用Iphlpapi.dll获取网络信息(上)

vb中使用Iphlpapi.dll获取网络信息(下) 


更多精彩 >>>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  VB6本身只支持16色(4位)和256色(8位)的图标,这种图标只是早期的Windows版本所采用的 图标格式标准。现在各种高清真彩色(32位带Alpha通道、24位不带Alpha通道)早已经很流行 并且普遍使用了,但在VB6却不能直接支持、使用。即使想把这种真彩色图标加入图标资源、 或者是把它加入ImageList控件,也会被提示“无效图片”而不能加入。记得论坛曾经有某 位高人说过,VB6的Form是支持真彩色图标的,可以给窗体设置真彩色图标。   昨天上午我试了一下,新建一个标准EXE工程,然后随意找了一个高清真彩图标文件,给工 程的Form1设置Icon属性,成功了……… 但是,感觉它显示的图标有点怪异,总觉得有些不对 劲呢…… 于是,我把这个高清图标文件32×32和16×16这两种规格的真彩色图标单独提取 出来,分别保存为一个.ico格式的文件,然后再用这两个图标文件来给它设置Icon属性。果然, 这两个文件在操作时VB6都提示“无效图片”!!!这就说明:VB6是不支持真彩色图标的。最 开始时“能设置成功”,只不过是因为它从图标组找到了256色的、它能支持的格式罢了。   闲话不多说了,这个模块进行了简单的封装,提供了一些基础的操作功能。源码有比较 详细的注释,使用起来应该是很简单的,就不再写什么“应用示例代码”了。首先要调用接口 函数装载图标,从图标文件加载就调用LoadFromFile(),从字节数组加载就调用LoadData()。 加载成功后,即可调用其它接口来使用图标对象了,比如用GDI方式把图标画到窗口内、或者画 到某个PictureBox上、给自己的窗口或别的程序窗口设置一个真彩色图标等。虽然在“资源” 不能以“图标”的方式把真彩图标加入,但是,却可以按“自定义资源”的方式把图标文件 装入,使用时读取出对应的资源数据,然后调用函数LoadFromData()进行加载。加载成功就可 以使用里面的真彩色图标了。   这个模块只提供了一些基本的功能,如果有需要可以自己再进行扩展。还有就是没有进行 异常处理,因此要求用来加载的文件必须是正确的图标文件、并且可以读取;数组数据则必须 是合法的图标文件数据。否则可能会引起异常,你也可以修改代码进行异常捕获处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值