双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

求以二维数组的形式访问DIB数据的方法.100分

boyzhang boyzhang 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

//'求C++代码

//'如何才能以二维数组的形式访问DIB数据?

//'也就是把一个 二维空数组 指向 DIB的数据 从而实现使用 二维数组结构 直接访问 DIB数据线性地址?


//'描述如下:

//'在做二值图像膨胀与腐蚀算法时,需要用到象素的逻辑坐标来
//'判断相邻的几个点的状态

//'通常的做法是使用计算的方法来得到逻辑坐标X,Y点上的索引


//'定义一个4字节模拟指针
Dim BYTE_DataPtr_DIB(0 To 3) As Byte, BYTE_DataPtr_DIB(0 To 0) As Long
//'生成指针
Call Mapping_Linear_BYTE_Pointer(BYTE_DataPtr_DIB, BYTE_DataPtr_DIB)
//'指向DIB数据
BYTE_AddrPointer_Of_pDIB(0) = cDIB.BitsPointer


For j = 0 To 图高
For i = 0 To 图宽
Index = (图高 - j) * DIB行数据长度 + i
//'指针地址
LONG_AddrPtr_DIB(0&) = Index

//'写入图像RGBA分量
BYTE_DataPtr_DIB(0) = 255 //'Blue
BYTE_DataPtr_DIB(1) = 255 //'Green
BYTE_DataPtr_DIB(2) = 255 //'Red
BYTE_DataPtr_DIB(3) = 255 //'Alpha
Next i
Next j


//'这样的做法有个缺点,就是程序写起来很麻烦


//'//////////////////////////////////////////////////////////////////
//'
//' 如何才能以二维数组的形式访问DIB数据?
//'
//'//////////////////////////////////////////////////////////////////


//'比如: VB中做图像处理可以用这样的方法

//'假定cDIB为DIB类
//'读取图像部分使用GDIPlus,DIB格式为32位,每个象素正好4个字节

//'定义一个二维数组,并不实际分配内存,只是让编译器产生一个数组类型
Dim VideoBuffer() As Long

//'生成二维安全数组,也就是说把这个数组设置成2维的长整形数组,并使其使用DIB图像数据的内存
With SA_Of_Buffer
.cbElements = 4 //'每元素4字节大小
.cDims = 2 //'共2维
.Bounds(0).lLbound = 0 //'从0开始
.Bounds(0).cElements = cDIB.Height //'第0维大小
.Bounds(1).lLbound = 0 //'从0开始
.Bounds(1).cElements = cDIB.Width //'第1维大小
.pvData = cDIB.BitsPointer //'使用DIB图像数据的内存(BitsPointer为DIB的指针)
End With
//'安全数组指向BMP
CopyMemory ByVal apiVarPtrArray(VideoBuffer), VarPtr(SA_Of_Buffer), 4

//'定义完成,就可以使用二维坐标来访问这个图像的数据区了
Dim i As Long, j As Long
For j = 0 To cDIB.Height - 1
For i = 0 To cDIB.Width - 1
VideoBuffer(i, j) = &HFFFF00FF
Next i
Next j

//'释放指针
CopyMemory ByVal apiVarPtrArray(VideoBuffer), 0&, 4

...全文
评论 6
收藏 已收藏
分享
返回顶部
boyzhang
图形处理/算法 19,463 成员 50,678 内容