小弟现在需要用MFC程序读取一个4096*19895的大bmp图像。使用
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,_T("D:\\XXX.bmp"),IMAGE_BITMAP,rectt.Width(),rectt.Height(),LR_CREATEDIBSECTION
|LR_LOADFROMFILE);
读取失败,返回NULL。
调用GetLastError()函数显示信息为“存数空间不足,无法完成操作”。事实上我显示该图像的矩形较小,因而实际需要显示的只是它的压缩版本。但是现在根本无法读入,请各位大虾指点!谢谢!

解决方案 »

  1.   

    抽线。
    4抽1就够了,变成1024*4973。
    读出BITMAPFILEHEADER,改成新的值,再读出BITMAPINFOHEADER改成新值,都写到一个新的BMP文件中,然后一条一条的读扫描线,读4行留一行,留下的一行没4个像元留一个像元,都写到新的BMP文件里面。处理新的BMP文件就可以了。什么系统?Win7 x64处理这样的图像应该一次没问题。
      

  2.   

    自己读文件呗,bmp文件格式msdn上都有
      

  3.   

    谢谢!我是Win Xp系统。
    我用如下代码进行您给的操作,但是生成的图像颜色出现了问题。不知道我这段代码是否正确?
    BITMAPFILEHEADER bmfHdr;
    BITMAPINFOHEADER bi,bi1;
    CFile file(_T("D:\\c-010-b2-1.bmp"),CFile::modeRead);//读取文件头
    file.Read(&bmfHdr,sizeof(BITMAPFILEHEADER));
    file.Read(&bi,sizeof(BITMAPINFOHEADER));
    DWORD dwSize=bi.biWidth*bi.biBitCount/8*bi.biHeight;//文件大小
    PBYTE pBuf=new BYTE[dwSize];//读取文件像素数据
    file.Read(pBuf,dwSize);
    file.Close();
    memcpy(&bi1,&bi,sizeof(BITMAPINFOHEADER));//目标文件的BITMAPINFOHEADER
    bi1.biWidth=bi.biWidth/4;
    bi1.biHeight=bi.biHeight/5; DWORD SrcLineSize=bi.biWidth*bi.biBitCount/8;//原文件一行字节数
    DWORD DestLineSize=bi1.biWidth*bi1.biBitCount/8;//目标文件的一行字节数
    DWORD DestSize=DestLineSize*bi1.biHeight;//目标文件大小
    PBYTE pBuf1=new BYTE[DestSize]; int i,j;
    BYTE *pSrc,*pDest;
    for(i=0;i<bi.biHeight;i=i+5)//5行选一行
    {
    for(j=0;j<bi.biWidth;j=j+4)//4个像素点选一个
    {
    pSrc=pBuf+SrcLineSize*i+4*j;
    pDest=pBuf1+DestLineSize*(i/5)+4*(j/4);
    memcpy(pDest,pSrc,4*sizeof(BYTE));
    }
    }
    请指点,谢谢!