首页
社区
课程
招聘
[求助]请问有关BMP图片读取的问题。
发表于: 2009-1-31 12:18 4762

[求助]请问有关BMP图片读取的问题。

2009-1-31 12:18
4762
下面代码中实现将一个bmp图片读取并转化成二值的二维数组,为什么有时候读取出并打印(即将二维数组表示成点阵图)出来的是
下面这种倾斜的图呢?而有的图片打印出来是正常、不倾斜的。
如果各位有好的现成的代码能否贴一下?
BOOL BmpToMatrix(LPCWCH lpDIBFilePath,PBmpMatrixInfo pOutBmpMatrixInfo)
{
    LPSTR    DIBBit=0;
    LONG     DIBsHeight=0;
    LONG     DIBsWidth=0;
    LPSTR    lpDIB=0;

    BYTE     bThre = 251;//阙值

        LONG i;        // 循环变量
        LONG j;
        LONG cout;

    RGBTRIPLE *rgb;
    CFile cf;

    BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER bmih;

        if (!cf.Open(lpDIBFilePath,CFile::modeRead))
        {

                return FALSE;
        }

        cf.SeekToBegin();
        cf.Read(&bmfh,sizeof(bmfh));
        cf.Read(&bmih,sizeof(bmih));

        DIBsWidth  = bmih.biWidth;
        DIBsHeight = bmih.biHeight;

        PBYTE Matrix=(PBYTE)malloc( DIBsWidth * 1 * DIBsHeight * sizeof(BYTE));
        memset(Matrix,0xcc , DIBsWidth * 1 * DIBsHeight * sizeof(BYTE));

        rgb = new RGBTRIPLE[bmih.biWidth*bmih.biHeight];
        cf.SeekToBegin();
        cf.Seek(54,CFile::begin);
        ULONGLONG len=cf.GetLength();
        cf.Read(rgb,bmih.biWidth*bmih.biHeight*3);

    bThre = 160;

        if ( 0 == Mode
        {
               
                for ( i=0; i<DIBsHeight;i++)
                {
                        for (  j= 0; j<(DIBsWidth); (++j))
                        {
                                BYTE color = (rgb[i*bmih.biWidth+j].rgbtRed + rgb[i*bmih.biWidth+j].rgbtGreen + rgb[i*bmih.biWidth+j].rgbtBlue)/3;

                                *(PBYTE)(Matrix +  1*DIBsWidth*i +j) = color<bThre? 0 : 255 ;
                               

                        }
                }
        }

       
        cf.Close();
        delete rgb;
                pOutBmpMatrixInfo->lHight = DIBsHeight;
        pOutBmpMatrixInfo->lWidth = DIBsWidth;
        pOutBmpMatrixInfo->Matrix = Matrix;
        return TRUE;

}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 148
活跃值: (59)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
j不递增试试.
2009-1-31 17:36
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
明显不行,那是扫描y方向的。试过后,果然不行。问题是为什么有的bmp图片得到的是倾斜的,怪事了。我这是网上照搬的代码
2009-1-31 20:26
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
上学期在linux下做的帧缓冲的实验,不知道是不是符合你的要求。
上传的附件:
2009-2-1 21:14
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
哈哈,不管行不行,先谢谢了!!
2009-2-2 16:38
0
雪    币: 218
活跃值: (129)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
每行都要补齐到DWORD边界。不然错位了就会是斜的。
2009-2-2 23:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
唔,6楼正解~
2009-2-3 16:00
0
雪    币: 203
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
bmp每行是按4字节对齐的
2009-2-3 19:17
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
听各位一说有眉目了,哈哈,不过能再提示一下在哪补上么?
2009-2-3 21:07
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
cf.SeekToBegin();
  cf.Read(&bmfh,sizeof(bmfh));
  cf.Read(&bmih,sizeof(bmih));

  DIBsWidth  = ((bmih.biWidth + 4) >> 2) << 2; // HERE
  DIBsHeight = bmih.biHeight;

  PBYTE Matrix=(PBYTE)malloc( DIBsWidth * 1 * DIBsHeight * sizeof(BYTE));
  memset(Matrix,0xcc , DIBsWidth * 1 * DIBsHeight * sizeof(BYTE));
2009-2-3 22:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
每行边界4字节对齐
2009-2-5 15:28
0
游客
登录 | 注册 方可回帖
返回
//