回 帖 发 新 帖 刷新版面

主题:[讨论]VB图像处理

Private Sub Command2_Click()       '**********************有问题
Dim BITMAP As BITMAPINFO
    Dim ImgData() As Byte
    Dim lIndex As Single
    
    
    With BITMAP
        .bmiHeader.biSize = 40
    End With
If GetDIBits(Picture1.hdc, Picture1.Picture.Handle, 0, 0, 0, BITMAP, DIB_RGB_COLORS) <> 0 Then      '获取图像位图数据大小
        ReDim ImgData(BITMAP.bmiHeader.biSizeImage / 3, 2) '重定义数组准备接收位图数据
        If GetDIBits(Picture1.hdc, Picture1.Picture.Handle, 0, BITMAP.bmiHeader.biHeight - 1, ImgData(0, 0), BITMAP, DIB_RGB_COLORS) <> 0 Then    '正式获取位图数据并将数据存入定义的数组中
            '注意数组中颜色分量的存储顺序为:B、G、R(并不是R、G、B),如果你需要对图像进行处理只需改变数组中的数据即可完成
            
            '**************** 下面这段程序是将图像亮度变暗(只作为演示,其它效果你可以自己动手做) ***********************
            '注意:第一条扫描线的位置是从左下角开始
            
            
            'ImgData(X,0)中保存的为蓝色分量值
            'ImgData(X,1)中保存的为绿色分量值
            'ImgData(X,2)中保存的为红色分量值
            
            For lIndex = 0 To BITMAP.bmiHeader.biSizeImage / 3 ***********这里的”/3"是何故,求解
                

                ImgData(lIndex, 0) = (ImgData(lIndex, 0) + ImgData(lIndex, 1) + ImgData(lIndex, 2)) / 3  ***显示溢出错误????怎么修改??

问题在最后两行;

回复列表 (共3个回复)

沙发

处理图像似乎有专用语言,用vb来做出力不讨好

板凳

因为24位真彩位图每3个字节表示一个像素,所以除以3的结果就是该图像有多少像素。
你的ImgData数组声明为字节型的,相加的时候就很可能溢出。可先转换为整形再相加,如:
(CInt(ImgData(lIndex, 0)) + CInt(ImgData(lIndex, 1)) + CInt(ImgData(lIndex, 2))) / 3

3 楼

很好奇上面的文字为何超出了边框。

我来回复

您尚未登录,请登录后再回复。点此登录或注册