【求助】将黑白BMP直接读取到数组中,不要用控件和api (数据区压缩过)
下面给出3副图像,我想不用控件和api,直接把数据读取到数组中, 
数据区被压缩过... http://it369.cn/bmp/1010.bmp 
http://it369.cn/bmp/4952.bmp 
http://it369.cn/bmp/6868.bmp 

解决方案 »

  1.   

    不用控件和API,那你用什么? 
    直接定义数组读文件吧,不明白可继续追问。
      

  2.   

    yes..我的意思就是用open XX for binary来读取...因为我打算用asp来写..所以不能用api和控件,直接把黑白点数据读取到数组中,如果没压缩的bmp我会,现在的文件数据区是被压缩过的了,不知道压缩算法,所以读不进来...麻烦高手了,或者有此类压缩算法的资料也可以...它现在是用128字节的数据表示了1024个像素(64*16)的内容
    7F 9F FD FE FC EF BF FB F7 9F FD EF FC BF EF FE 
    7F 9F F8 7F FC FE FB EF 7F 9F F3 3F FC EF BF FD 
    DF 9F F3 3F FC DF F0 F7 F7 9F F3 3F FC FE E6 7F 
    FE 9F F3 3F FC F7 E6 7F FD 9F F3 3F FC FD E6 7F 
    FE 1F F3 3F F0 FB E6 7F FB 9F F3 3F FC 7F E6 7F 
    FB EF F3 3F DF FB E6 7F FD FE F8 7F F7 FD E6 7F 
    FE BF F7 FB F7 FE E6 7F FE F7 EF 7F F7 F7 F0 F7 
    DF BF FE FB FD FD FB DF FE DF 7F FE FE BF EF 7F 
      

  3.   

    Private Sub Command1_Click()
        Dim str1 As String, str2() As String
        Dim w As Long, x As Long, y As Long, i As Long, c1 As String, c2 As Long
        Dim data(1023) As Long
        
        str1 = "7F 9F FD FE FC EF BF FB F7 9F FD EF FC BF EF FE " & _
            "7F 9F F8 7F FC FE FB EF 7F 9F F3 3F FC EF BF FD " & _
            "DF 9F F3 3F FC DF F0 F7 F7 9F F3 3F FC FE E6 7F " & _
            "FE 9F F3 3F FC F7 E6 7F FD 9F F3 3F FC FD E6 7F " & _
            "FE 1F F3 3F F0 FB E6 7F FB 9F F3 3F FC 7F E6 7F " & _
            "FB EF F3 3F DF FB E6 7F FD FE F8 7F F7 FD E6 7F " & _
            "FE BF F7 FB F7 FE E6 7F FE F7 EF 7F F7 F7 F0 F7 " & _
            "DF BF FE FB FD FD FB DF FE DF 7F FE FE BF EF 7F"
        
        str2 = Split(str1, " ")
        
        For w = 0 To 127
            If (w + 1) Mod 16 = 0 Then
                x = x + 1
            End If
            
            c1 = D_To_B("&H" & str2(w))
            For i = 0 To 7
                c2 = Mid(c1, i + 1, 1)
                data(x * w + i) = IIf(c2, 255, 0)
            Next
        Next
    End SubPublic Function D_To_B(ByVal Dec As Long) As String
        Do
            D_To_B = Dec Mod 2 & D_To_B
            Dec = Dec \ 2
        Loop While Dec
        D_To_B = Format(D_To_B, "00000000")
    End Function未测试,仅供参考。
      

  4.   

    "直接把数据读到数组中"不知道你读到数组中是以什么格式?二进制?那就太好说了:open XX for binary as #1
        dim Buffer() as byte
        
        redim buffer(lof(1)-1)
        get 1,,buffer
    colse #1这样,图像的二进制是到了BUFFER里去了....但是你要的是不是这效果啊.反正没明白你啥意思.
      

  5.   

    Option ExplicitPrivate Sub Form_Load()
        Const W As Long = 64
        Const H As Long = 16
        Const ZOOM As Long = 10
        Dim a() As String
        Dim x As Long, y As Long, i As Long, n As Byte, c As Long
        
        Me.AutoRedraw = True
        Me.ScaleMode = vbPixels
        Line (0, 0)-(W * ZOOM, H * ZOOM), vbBlack, BF
        
        a = Split("7F 9F FD FE FC EF BF FB F7 9F FD EF FC BF EF FE " & _
                  "7F 9F F8 7F FC FE FB EF 7F 9F F3 3F FC EF BF FD " & _
                  "DF 9F F3 3F FC DF F0 F7 F7 9F F3 3F FC FE E6 7F " & _
                  "FE 9F F3 3F FC F7 E6 7F FD 9F F3 3F FC FD E6 7F " & _
                  "FE 1F F3 3F F0 FB E6 7F FB 9F F3 3F FC 7F E6 7F " & _
                  "FB EF F3 3F DF FB E6 7F FD FE F8 7F F7 FD E6 7F " & _
                  "FE BF F7 FB F7 FE E6 7F FE F7 EF 7F F7 F7 F0 F7 " & _
                  "DF BF FE FB FD FD FB DF FE DF 7F FE FE BF EF 7F", _
                  " ")
        
        i = 0: n = CByte("&H" & a(i)): c = 8
        For y = H - 1 To 0 Step -1 '屏幕坐标上下颠倒
            For x = 0 To W - 1
                If (n And &H80) <> 0 Then '白点
                    Line (x * ZOOM, y * ZOOM)-((x + 1) * ZOOM, (y + 1) * ZOOM), vbWhite, BF
                End If
                c = c - 1
                If c = 0 Then
                    i = i + 1
                    If i <= UBound(a) Then n = CByte("&H" & a(i))
                    c = 8
                Else
                    n = (n And &H7F) * 2
                End If
            Next
        Next
    End Sub
      

  6.   

    其实很容易,但我目前没时间给你详细写。正规写法是:先读文件头,然后在文件头规定的数据开始处根据文件头设定的图片尺寸读取像素数据。如果你觉得麻烦,我还有个最简单的办法:首先你必须清楚图片的尺寸宽度W以及高度H,则像素数N=W×H。然后从文件结尾开始,读N个字节。这种方式的缺点在于:由于有些BMP结尾不规范,因此会有P个像素差异。由于P个像素差异,会导致你显示出的图象向右或向左滚动P列。当年我在DOS下的QBASIC里经常这样用,直接从文件结尾开始读320×200 BMP的字节,然后一股脑灌到显示缓冲区里。如果你想把数组里的BMP在VB下显示到屏幕上,则需要用API函数StretchDIBits。还有一种做法是:你以数组形式保存的时候是8Bit灰度,但显示之前把它转换成24bit位图。因为API对24Bit位图支持更好一些。下面是我一个读24Bit彩色BMP的结构定义,灰度图片与其不大一样。tpBitMapFileHeader和tpBitMapInfoHeader定义了BMP文件的文件头。
    tpBitMapInfoHeader.biBitCount定义了图象的色深。黑白BMP为8;24Bit彩色图片为24。tpBitMapInfo是StretchDIBits显示图片时需要的结构。需要特别注意的是:8位的黑白图片实际是一种特殊颜色表的IndexColor格式的图片。与8位伪彩图片的区别就是颜色表的定义。
    颜色表的格式是tpRGBQuad数组,从0到255,有256个元素。
    我在VB下没写过针对8位图片的程序,所以不清楚VB下颜色表是怎么定义。相关资料你自己去找。Public Type tpBitMapFileHeader
      bfType As Integer
      bfSize As Long
      bfReserved1 As Integer
      bfReserved2 As Integer
      bfOffBits As Long
    End TypePublic Type tpBitMapInfoHeader
      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 TypePublic Type tpRGBQuad
      rgbBlue As Byte
      rgbGreen As Byte
      rgbRed As Byte
      rgbReserved As Byte
    End TypePublic Type tpBitMapInfo
      bmiHeader As tpBitMapInfoHeader
      bmiColors As tpRGBQuad
    End Type
      

  7.   

    我建议你首先要了解一下索引色(Index Color)与24Bit格式的区别。因为初学者最容易搞不明白的就是8位灰度图片与8位256色伪彩图片的区别。其次是一维空间与二维空间的换算。I=一维索引
    W=点阵宽度
    X,Y=二维坐标I=Y*W+XX=I Mod W
    Y=I \ W
      

  8.   

    你先需要了解BMP文件格式,我记得是在第54个字节开始进入数据区。然后切记BMP数据是反过来的,54字节后的数据是先图片的最后一行,再第一行。不同宽度的图片可能会在每行有0~2个字节的空出。