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

boyzhang 2009-03-09 01:21:42

//'求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

...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
eblis88 2009-03-10
  • 打赏
  • 举报
回复
//动态分配二维数组空间
{
m_iHight=10;//二维数组的高度
m_iWidth=10;//二维数组的宽度
//动态分配一个二维数组m_ppTable内存空间
//其类型为int
//m_ppTable指向该数组
int **m_ppTable;
m_ppTable=new int *[m_iHight];
//动态分配m_iHight个类型为int *的内存空间
//分配的是行地址空间
for(int i=0;i<m_iHight;i++)
m_ppTable[i]= new int[m_iWidth];
//动态分配m_iWidth个类型为int的内存空间
//分配的是某行的数值空间
}
//由此分配的二维数组空间并非是连续的
//可以使用m_ppTable[row][col]来给该二维数组赋值
//其中 0<=row<m_iHight;0<=col<m_iWidth;


//释放所分配的内存空间
{
for(int i=0;i<m_iHight;i++)
delete[m_iWidth]m_ppTable[i]; //以行为单位释放数值空间
delete [m_iHight]m_ppTable; //释放行地址空间
}
boyzhang 2009-03-09
  • 打赏
  • 举报
回复
How to?
会思考的草 2009-03-09
  • 打赏
  • 举报
回复
如果是一个一维数组,可以定义一个一维指针数组来当成二维数组来使用。
让这个指针数组中每个指针指向一行或者一列的第一个元素。
cnzdgs 2009-03-09
  • 打赏
  • 举报
回复
图象宽度*每像素字节数必须是4的整数倍时才能用二维数组来储存。可以根据像素位数定义结构来表示每个像素的数据,例如128*64,24位位图可以这样定义:
struct Pixel24
{
BYTE r;
BYTE g;
BYTE b;
};
Pixel24 pixels[64][128];
jameshooo 2009-03-09
  • 打赏
  • 举报
回复
用CImage吧,加载位图后可以通过CImage::GetPixelAddress(i,j)来获取地址,可以把这个地址转换成BYTE*
pByte[0] = [r];
pByte[1] = [g];
pByte[2] = [b];
pByte[3] = [a];
或者直接调用CImage::SetPixel(i,j,COLORREF)来设置像素。
boyzhang 2009-03-09
  • 打赏
  • 举报
回复
要求只是使用数组结构,并不真的为数组分配内存,也不能使用二维数组保存每个象素的地址,

需要直接把一个空数组指向DIB数据,并以二维的形式来访问DIB中对应的象素;


for(int j=0;j<cDIB.Height-1;j++)
{
for(int i=0;i<cDIB.Width-1;i++)
{
Buffer[i][j] = 0xffff00ff;
}
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧