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;
 }
这段代码能够通过编译,但是在运行的时候程序却处于假死状态,我不知道是处理量太大的缘故还是程序存在逻辑错误,各位指点一下。

解决方案 »

  1.   

    你卷积是用二维模板做卷积吧?转化为二维你首先要知道你图像的大小,然后把这个数组按二维的方式展开。
    至于你说的单行4的整数倍问题是在卷积处理时候需考虑的,你上面的代码没涉及到,也没用到你所谓的abc,所以感觉死机不是你上面代码的问题,你再查查原因!
      

  2.   

    LZ,你难道连打开图片也自己写代码。用DX,opencv....  这些都足够用了。图片有那么多种格式,有那么多种类型,你还能一个一个去解析不成。