linux上实现,图像文件头,位图信息头,彩色板先不用考虑,主要是想问图像数据阵列如何转换,16 bit 是两个字节表示一个像素,而1 bit是一个字节代表8个像素,比如:xsize表示宽度,ysize表示高度,xsize,ysize都是16的整数倍,buf是16bit的数据阵列,buf2是转换的1bit目标数据阵列初始化内存全是0我的代码是
for(int i=0;i<ysize;i++)
   for(int j=0;j<xsize;j++)
   {
      if(buf[i*xsize*2+j*2] != 0) 
        buf2[ (i*xsize*2+j*2 ) /16 ] |= 1 << j%8;  
   }可惜转过来不对,请教大家怎么转???

解决方案 »

  1.   

    dont quite understand your code.
      

  2.   

    行宽计算错误
    for(int i=0;i <ysize;i++) 
      for(int j=0;j <xsize;j++) 
      { 
          if(buf[i * linew+ j*2] != 0) //注意访问溢出
            buf2[ (i * linew + j*2 ) /16 ] |= 1 < < j%8;  
      }宽 linew =( bmih.biWidth * bmih.biBitCount + 31 ) / 32 * 4;
      

  3.   

    to 楼上:
    if(buf[i*xsize*2+j*2] != 0)这句应该可能访问到无用的填充字节吧,不会溢出吧。
    目标的位图的buf2的linew也要通过linew2 =( bmih.biWidth + 31 ) / 32 * 4;来计算吧。
      

  4.   

    buf和buf2都是什么类型?如果buf是WORD数组
    if(buf[i*xsize*2+j*2] != 0)
    应改为:
    if(buf[i*xsize+j] != 0)
    如果buf是BYTE数组
    if(buf[i*xsize*2+j*2] != 0)
    应改为:
    if(*(WORD*)(buf+i*xsize*2+j*2) != 0)如果buf2是BYTE数组
    buf2[(i*xsize*2+j*2)/16] |= 1 << j%8;
    应改为:
    buf2[(i*xsize*2+j*2)/8] |= 1 << j%8;
    如果buf2是WORD数组
    buf2[(i*xsize*2+j*2)/16] |= 1 << j%8;
    应改为:
    buf2[(i*xsize*2+j*2)/16] |= 1 << j%16;转成1bit后要注意每行按4字节对齐。
    另外,二值化一般是选定一个域值,判断大于或小于该值时转成1或0,而不是按是否等于0来决定。
      

  5.   

    感谢大家回帖,我一开始不知道bmp宽度要按4字节对齐的,所以怎么搞都不对,现在知道了,
    问题解决,再次谢谢大家,都有分啊,呵呵!