19,468
社区成员
发帖
与我相关
我的任务
分享
//'求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
struct Pixel24
{
BYTE r;
BYTE g;
BYTE b;
};
Pixel24 pixels[64][128];
for(int j=0;j<cDIB.Height-1;j++)
{
for(int i=0;i<cDIB.Width-1;i++)
{
Buffer[i][j] = 0xffff00ff;
}
}