| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4325 人关注过本帖
标题:请问怎样VB读取位图的像素信息
只看楼主 加入收藏
qiebei111
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-16
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:15 
请问怎样VB读取位图的像素信息
请问怎样VB读取位图的像素信息
搜索更多相关主题的帖子: 信息 
2011-12-16 16:01
qiebei111
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-16
收藏
得分:0 
急急
2011-12-16 16:01
编程的乐趣
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:229
专家分:1027
注 册:2011-4-4
收藏
得分:0 
.
2011-12-16 16:09
sailingzyf
Rank: 2
等 级:论坛游民
帖 子:3
专家分:12
注 册:2011-11-20
收藏
得分:2 
用个picturebox显示图像,然后在MouseDown或者MouseMove事件里用picturebox的point方法能获得颜色值
2011-12-16 16:23
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:5 
位图是指 BMP ,还是指 显示出来的图像。
最简单的方法 就是 4 楼的方法。

如果BMP 话,你可以参考下面的代码,


Attribute VB_Name = "BmpConst"
Option Explicit

'Bmp公用函数


'BMP压缩类型,
Public Const BI_RGB = 0     '非压缩
Public Const BI_RLE8 = 1
Public Const BI_RLE4 = 2



Public Type BMP文件头结构类型
    文件类型标识 As String * 2      '二字节长,只能为BM
    文件长度 As Long                '文件长度,4字节
    保留字1 As Integer              '系统保留,2字节,只能为0
    保留字2 As Integer              '系统保留,2字节,只能为0
    数据起始位置 As Long            '数据起始位置,相对数据头
End Type
   
   
Public Type BMP文件颜色表类型
    蓝 As Byte
    绿 As Byte
    红 As Byte
    保留 As Byte
End Type
   
Public Type BMP文件位图信息头类型
    本结构长度 As Long              '本结构的长度,包含颜色表的
    图像宽 As Long                  '图像宽
    图像高 As Long                  '图像高
    目标设备级别 As Integer         '目标设备级别,只能为1
    色彩位数 As Integer             '每像素色彩位数,只能为1(双色),4(16色),8(256色),24(真彩) 四种
    压缩 As Long                    '是否是压缩的,必须是 0(不压缩), 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    位图大小 As Long                '位图数据区的大小
    位图水平分辨率 As Long          '位图水平分辨率,每米像素数,好像可以为零
    位图垂直分辨率 As Long          '位图垂直分辨率,每米像素数,好像可以为零
    使用的颜色数 As Long            '位图实际使用的颜色表中的颜色数
    重要的颜色数 As Long            '位图显示过程中重要的颜色数
'    颜色表() as BMP文件颜色表类型   '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
End Type

Public Type BMP扫描行类型
    X() As Byte
    空() As Byte
End Type

Public Type BMP文件类型
    文件标识 As BMP文件头结构类型
    位图信息 As BMP文件位图信息头类型
    颜色表() As BMP文件颜色表类型   '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
    数据() As BMP扫描行类型         '位图数据,合并为每个像素一个long值
End Type


'句扟椀BitCount=1时,8个像素占1个字节;
'句扟椀BitCount=4时,2个像素占1个字节;
'句扟椀BitCount=8时,1个像素占1个字节;
'句扟椀BitCount=24时,1个像素占3个字节;
'埥椀渀搀漀眀猀规定一个扫描行所占的字节数必须是
'4的倍数(即以long为单位),不足的以0填充,
'一个扫描行所占的字节数计算方法:
'DataSizePerLine= (biWidth* biBitCount+31)/8;
'// 一个扫描行所占的字节数
'DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
'位图数据的大小(不压缩情况下):
'DataSize= DataSizePerLine* biHeight;


Public Function openbmp(Bmpfile As String, ByRef BMP文件 As BMP文件类型) As Integer
'打开BMP文件,读取数据
If Dir(Bmpfile) <> "" Then
Dim fj As Long
Dim i As Long
Dim colortmp() As Long
Dim 扫描行 As Long, 保留 As Long


With BMP文件
    fj = FreeFile()
    Open Bmpfile For Binary As #fj
        Get #fj, , .文件标识        '读文件标识
        If .文件标识.文件类型标识 = "BM" Then   '是BMP文件否
            Get #fj, , .位图信息
                ReDim .数据(.位图信息.图像高 - 1)
               
                扫描行 = (.位图信息.图像宽 * .位图信息.色彩位数) / 8
                保留 = 4 - (扫描行 Mod 4)
                For i = 0 To .位图信息.图像高 - 1
                    ReDim .数据(i).X(扫描行 - 1)
                    If 保留 > 0 And 保留 < 4 Then
                        ReDim .数据(i).空(保留 - 1)
                    End If
                Next i
            
                Select Case .位图信息.色彩位数
                    Case 1                  '2色图片
                        ReDim .颜色表(1)        '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                    Case 4                  '16色图片
                        ReDim .颜色表(15)       '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                    Case 8                  '256色图片
                        ReDim .颜色表(255)      '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                        
                    Case 24                  '真彩图片,无颜色表
                        'i = (.位图信息.图像宽 - 1) * (.位图信息.图像高 - 1)
                        'ReDim .数据(i)
                        'ReDim .数据(.位图信息.图像宽, .位图信息.图像高, 2)
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                End Select
            
        Else        '文件标识不对,打开失败
            openbmp = -2
        End If
    Close #fj
End With
Else    '文件不存在,打开失败
    openbmp = -1
End If
End Function

Public Function viewbmp(BMP文件 As BMP文件类型, PIC As PictureBox) As Integer

Dim i As Long, j As Long, k As Long, n As Byte
Dim i1 As Integer, i2 As Integer
Dim ycon() As Long


With BMP文件
PIC.Cls
If .位图信息.色彩位数 < 24 Then
    i1 = .位图信息.色彩位数 ^ 2
    ReDim ycon(i1)
    For i = 0 To i1
        ycon(i) = RGB(.颜色表(i).红, .颜色表(i).绿, .颜色表(i).蓝)
    Next i
End If
For i = 0 To .位图信息.图像高 - 1
'    For j = 1 To .位图信息.图像高
        Select Case .位图信息.色彩位数
        Case 1
            For j = 0 To (.位图信息.图像宽 / 8)
                For k = 0 To 7
                    n = 2 ^ (7 - k)
                    If j * 8 + k < .位图信息.图像宽 Then
                        i1 = .数据(i).X(j) And n / n        '第n位
                        PIC.PSet (j * 8 + k, .位图信息.图像高 - i), ycon(i1)
                    End If
                Next k
            Next j
        
        Case 4
            For j = 0 To (.位图信息.图像宽 / 2) - 1
                i1 = .数据(i).X(j) \ 16        '高位
                i2 = .数据(i).X(j) Mod 16      '低位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)
                PIC.PSet (j * 2 + 1, .位图信息.图像高 - i), ycon(i2)
            Next j
            If j * 2 < .位图信息.图像宽 Then        '还少了一点
                i1 = .数据(i).X(j) \ 16        '高位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)
            End If
        
        Case 8
            For j = 0 To .位图信息.图像宽 - 1
                PIC.PSet (j, .位图信息.图像高 - i), ycon(.数据(i).X(j))
            Next j
        
        Case 24
            For j = 0 To .位图信息.图像宽 - 1
                PIC.PSet (j, .位图信息.图像高 - i), RGB(.数据(i).X(j * 3 + 2), .数据(i).X(j * 3 + 1), .数据(i).X(j * 3 + 0))
            Next j
'    Next j
        End Select
Next i
End With
End Function

授人于鱼,不如授人于渔
早已停用QQ了
2011-12-16 19:06
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
这个代码,只支持非压缩的 BMP 文件。

授人于鱼,不如授人于渔
早已停用QQ了
2011-12-16 19:08
sailingzyf
Rank: 2
等 级:论坛游民
帖 子:3
专家分:12
注 册:2011-11-20
收藏
得分:0 
回复 6楼 风吹过b
解析文件内容的话最直接,不过bmp的格式版本不少,要是正好碰到个不认的就……有没有API能直接加载图像的,不借助picturebox
2011-12-16 22:17
qiebei111
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-16
收藏
得分:0 
很谢谢!我试试
2011-12-19 08:50
qiebei111
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-16
收藏
得分:0 
你好!我需要显示图像用的,不太懂VB,但老大又必须要VB的代码,
2011-12-19 09:23
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:10 
这一堆代码里,就二个函数,一个是读 BMP 文件的函数,一个是显示图像的函数。
另外还有一个结构
openbmp(Bmpfile As String, ByRef BMP文件 As BMP文件类型)
读BMP文件函数,第一个参数是 BMP 的文件名,第二个参数是 BMP文件类型的结构
执行这个函数后,在这个结构中,保存了BMP文件的所有信息,包括
文件头,BMP信息头,每个位置的 颜色值。
位图信息.色彩位数
下面这段代码在显示部分里有。 ycon 是颜色表,转化为 RGB 保存的。
        Select Case .位图信息.色彩位数
        Case 1    '二色图片
            For j = 0 To (.位图信息.图像宽 / 8)
                For k = 0 To 7
                    n = 2 ^ (7 - k)                         '生成掩码
                    If j * 8 + k < .位图信息.图像宽 Then    '确保当前是需要的象素点
                        i1 = .数据(i).X(j) And n / n        '第n位 ,逻辑运算然后再位移运算
                        PIC.PSet (j * 8 + k, .位图信息.图像高 - i), ycon(i1)   查找颜色表,然后显示在指定位置
                    End If
                Next k
            Next j
        
        Case 4                '16色,
            For j = 0 To (.位图信息.图像宽 / 2) - 1
                i1 = .数据(i).X(j) \ 16        '高位            '每个字节包括二个象素,这里分来开。
                i2 = .数据(i).X(j) Mod 16      '低位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)       '绘制2个像素
                PIC.PSet (j * 2 + 1, .位图信息.图像高 - i), ycon(i2)
            Next j
            If j * 2 < .位图信息.图像宽 Then        '还少了一点     '如果图像宽是奇数位,最后一个字有可能与空的半个字节在一起,需要单独处理
                i1 = .数据(i).X(j) \ 16        '高位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)
            End If
        
        Case 8     '256色图像,一个像素占一个字节,直接查颜色表就可以了。
            For j = 0 To .位图信息.图像宽 - 1      
                PIC.PSet (j, .位图信息.图像高 - i), ycon(.数据(i).X(j))    '指定位置,查表显示,不用管空单元
            Next j
        
        Case 24    '真彩图像,每个像素用三个字节,无颜色表,这三个字节对应着 BGR 三种颜色。直接生成颜色值就可以了。
            For j = 0 To .位图信息.图像宽 - 1
                PIC.PSet (j, .位图信息.图像高 - i), RGB(.数据(i).X(j * 3 + 2), .数据(i).X(j * 3 + 1), .数据(i).X(j * 3 + 0))
            Next j
        End Select
你看懂这个代码段,就知道读取结构后,每个位置的颜色值的。

viewbmp(BMP文件 As BMP文件类型, PIC As PictureBox) As Integer
这个函数用来显示 BMP 文件,传入二个参数
参数1,需要绘制的BMP文件的结构。参数2,需要绘制的 目标对象,这里只支持 pictureBox 控件。
如果你不是从 0,0 绘制起,就需要自己修改这个函数,修改偏移坐标。

授人于鱼,不如授人于渔
早已停用QQ了
2011-12-19 14:45
快速回复:请问怎样VB读取位图的像素信息
数据加载中...
 
   



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

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