标题:VB的SetDIBits的处理图像困惑
只看楼主
huangjunxing
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2014-8-13
结帖率:50%
 问题点数:0 回复次数:2 
VB的SetDIBits的处理图像困惑
图像本来是这样的

在X(0 to 100),y(0 to 100 )区域填充白色,结果成这样在



lrtn = GetDIBits(Picture1.hdc, Picture1.Picture.Handle, 0&, iHeight, bits(0, 0, 0), bi24BitInfo, 0&)


For ix = 0 To 100
For iy = 0 To 100
bits(0, ix, iy) = 255
bits(1, ix, iy) = 255
bits(2, ix, iy) = 255

Next
Next

Picture1.Picture = Picture1.Image
SetDIBits Picture1.hdc, Picture1.Picture.Handle, 0&, iHeight, bits(0, 0, 0), bi24BitInfo, 0&
Picture1.Picture = Picture1.Image
搜索更多相关主题的帖子: VB 处理 图像 困惑 Picture 
2017-09-23 23:31
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
感觉 错误在于 位图数据结构理解上
位图要求每个扫描行都是 4 个字节的整数倍,
你将位图载入一个3维数组,但是没有处理中的每个扫描行的凑整的数据,然后就造成这种情况。
说实在的,这样载入的位图数据,我都不知如何下手去修改。
要么你整好个图像宽为 4的倍数宽。再去测试你的程序,就知道是不是这个原因。

---
我是使用 PropertyBag  对象去读取 位图数据,会带一个 PropertyBag 数据头,然后得到的数据,
如果原图是BMP,得到的就是BMP数据,然后分析数据,计算每个扫描行的起始元素再使用循环去填充。
当原图不是BMP的,那就先复制一份,得到的就是BMP格式了。

分析代码,目前不知扔哪里去了,用于前面一个贴子 躲避球 的小游戏多线程 代码中,因为那个框架不是我的,所以也没发代码。
目前没兴趣重写了。

BMP文件头定义,使用 PropertyBag 导出的位图数据也使用这个文件头。
程序代码:
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 ByteAs 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扫描行类型         '位图数据
End Type

授人于鱼,不如授人于渔
早已停用QQ了
2017-09-24 08:21
huangjunxing
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2014-8-13
得分:0 
自己失误,搞好了
2017-09-25 09:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-480898-1-1.html




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

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