现在位图一般都是8位和24位的,因此在读入图像处理时总想8位的作为24位来显示,从而绕过调色板这一层,便于统一处理,但为什么8位转为24位显示时有的图像(宽度为偶数)正常,有的则变形,请高手指点一二,谢谢

解决方案 »

  1.   

    这个问题这几天我也遇到过,郁闷了好几天。经过几天的思考和高人指点,有了点头绪。不敢独享,就和大家讨论一下。
    bmp图片的格式有一个要求:就是一行的字节数必须是4的倍数(我只知道必须这样,但我不知道为什么这样,而且我觉得这样很不方便,没有必要)。比如WIDTH=150,在24位的图片中,一行的字节数应该是150*3=450,可是450不是4的倍数,所以要变成452。同时,8位的情况下,150也不是4的倍数,也应该变成152,所以当你在做8位和24位之间变换的时候,就会出现问题了(152*3!=452)。
    我想图象变形的原因就在这吧。很显然,如果图象的宽度是4的倍数,这样的情况就不会出现。要解决这个问题,你可以用以下的代码(来自CSDN上其他网友的帖子)
    看看这个帖子。http://expert.csdn.net/Expert/topic/1809/1809709.xml?temp=.155987
      

  2.   

    读数据也没有问题,我上面写错了,其实对于行宽为奇数的图像有的也可以正常打开显示,但有的就不行,为了说清楚点,我把这段代码贴过来
        HANDLE stream;
    BITMAPFILEHEADER Bmp_file_head;
    unsigned char* lpbitsrc;
    BITMAPINFO *lpbitmap;
    int size;
    int BitCount;
    unsigned long dwNotUsed;    stream = CreateFile (lpFileName,
                           GENERIC_READ, 0, NULL, OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL, NULL);
    if( stream == INVALID_HANDLE_VALUE )
    return FALSE; ReadFile(stream,&Bmp_file_head,sizeof(BITMAPFILEHEADER),&dwNotUsed,NULL);
      if(Bmp_file_head.bfType!=0x4d42)
    {
      AfxMessageBox("图象文件不是位图!");
      return FALSE;
    } size=Bmp_file_head.bfOffBits-sizeof(BITMAPFILEHEADER);
    lpbitmap=(BITMAPINFO *) new BYTE[size];
    ReadFile(stream,lpbitmap,size,&dwNotUsed,NULL);
    BitCount=lpbitmap->bmiHeader.biBitCount;

    size=Bmp_file_head.bfSize-Bmp_file_head.bfOffBits;
    lpbitsrc=new BYTE[size];
    ReadFile (stream,lpbitsrc,size,&dwNotUsed,NULL);
    CloseHandle (stream);
    int Width,Height;
    Width=lpbitmap->bmiHeader.biWidth;
    Height=lpbitmap->bmiHeader.biHeight;
    size = WIDTHBYTES(Width*24)*Height;
    pData=new BYTE[size];
    ASSERT(pData != NULL);
    int i,j;
             int tempWidth;
    int temp;

    if(BitCount==24)
    memcpy(pData,lpbitsrc,size);
      if(BitCount==8)
    {
            tempWidth=WIDTHBYTES(8*Width);
            for(i=0;i<Height;i++)
    for(j=0;j<Width;j++)
    {
    temp=lpbitsrc[i*tempWidth+j];
    pData[(i*Width+j)*3]=lpbitmap->bmiColors[temp].rgbBlue;
    pData[(i*Width+j)*3+1]=lpbitmap->bmiColors[temp].rgbGreen;
    pData[(i*Width+j)*3+2]=lpbitmap->bmiColors[temp].rgbRed;
    }
        }

    delete  lpbitmap;
    delete  lpbitsrc;
    WIDTHBYTES()宏是用来对行字节取4倍数变换的,pData就是最后要显示的数据,显示时我自己做个24位的信息头就行了
      

  3.   

    pData[(i*Width+j)*3]有问题。
    这样试试:newLineBytes=WIDTHBYTES(Width*24);
    pData[i*newLineBytes+j*3]=...
      

  4.   

    bmp图片一个扫描行的字节数必须是4的倍数,应该就是这个了。