1、图像在打开之前并不知道其大小,所以没办法先开辟一个二维数组,必须动态创建二维数组。
2、现在的bmp图像一般都是24位的,读进数据以后数据区是一维的,但是如果要做卷积的话必须转化到二维空间,这就遇到了问题:一维数组转为二维数组的问题。
3、24位图用3BYTE表示一个像素,这很好办。但是问题是每行BYTE数必须是4的倍数,所以在每行末尾有可能需要添加0,导致一维转二维很麻烦。
为了解决上述三个问题,我编写了一段代码:
UINT abc=Bmpwidth%4;//图像数组每一行必须达到4BYTE的倍数,如果不够需要补零abc个0
vector<vector<BYTE> >TwoD(Bmphight,vector<BYTE>(Bmpwidth*3));//动态开辟二维数组
UINT rs=0;//rs为计数器,用于遍历一维原始图像数据
for(UINT h=Bmphight-1;h>=0;h--)
{
for(UINT w=0;w<Bmpwidth*3;w++)
{
UINT interval=(Bmphight-1-h)*Bmpwidth*3+w;//interval代表指针m_pData位置
rs=interval;//将指针位置传出第二次for循环。
TwoD[h][w]=*(m_pData+interval);//m_pData指向图像一维数据区
}
rs+=abc;
}
/****************************************************************************************************/
在此写图像处理的代码
/****************************************************************************************************/
//下面,运算完成以后将二维数组还原为一维数组交给原来的指针
memset(m_pData,0,Bmpsize);//Bmpsize为一维图像数据字节大小
UINT gis=0;
for(UINT h3=Bmphight-1;h3>=0;h3--)
{
for(UINT w3=0;w3<Bmpwidth*3;w3++)
{
UINT interval3=(Bmphight-1-h)*Bmpwidth*3+w3;
gis=interval3;
*(m_pDataCopy+interval3)=TwoD[h3][w3];
}
gis+=abc;
}
这段代码能够通过编译,但是在运行的时候程序却处于假死状态,我不知道是处理量太大的缘故还是程序存在逻辑错误,各位指点一下。
2、现在的bmp图像一般都是24位的,读进数据以后数据区是一维的,但是如果要做卷积的话必须转化到二维空间,这就遇到了问题:一维数组转为二维数组的问题。
3、24位图用3BYTE表示一个像素,这很好办。但是问题是每行BYTE数必须是4的倍数,所以在每行末尾有可能需要添加0,导致一维转二维很麻烦。
为了解决上述三个问题,我编写了一段代码:
UINT abc=Bmpwidth%4;//图像数组每一行必须达到4BYTE的倍数,如果不够需要补零abc个0
vector<vector<BYTE> >TwoD(Bmphight,vector<BYTE>(Bmpwidth*3));//动态开辟二维数组
UINT rs=0;//rs为计数器,用于遍历一维原始图像数据
for(UINT h=Bmphight-1;h>=0;h--)
{
for(UINT w=0;w<Bmpwidth*3;w++)
{
UINT interval=(Bmphight-1-h)*Bmpwidth*3+w;//interval代表指针m_pData位置
rs=interval;//将指针位置传出第二次for循环。
TwoD[h][w]=*(m_pData+interval);//m_pData指向图像一维数据区
}
rs+=abc;
}
/****************************************************************************************************/
在此写图像处理的代码
/****************************************************************************************************/
//下面,运算完成以后将二维数组还原为一维数组交给原来的指针
memset(m_pData,0,Bmpsize);//Bmpsize为一维图像数据字节大小
UINT gis=0;
for(UINT h3=Bmphight-1;h3>=0;h3--)
{
for(UINT w3=0;w3<Bmpwidth*3;w3++)
{
UINT interval3=(Bmphight-1-h)*Bmpwidth*3+w3;
gis=interval3;
*(m_pDataCopy+interval3)=TwoD[h3][w3];
}
gis+=abc;
}
这段代码能够通过编译,但是在运行的时候程序却处于假死状态,我不知道是处理量太大的缘故还是程序存在逻辑错误,各位指点一下。
至于你说的单行4的整数倍问题是在卷积处理时候需考虑的,你上面的代码没涉及到,也没用到你所谓的abc,所以感觉死机不是你上面代码的问题,你再查查原因!