小弟现在需要用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()函数显示信息为“存数空间不足,无法完成操作”。事实上我显示该图像的矩形较小,因而实际需要显示的只是它的压缩版本。但是现在根本无法读入,请各位大虾指点!谢谢!
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,_T("D:\\XXX.bmp"),IMAGE_BITMAP,rectt.Width(),rectt.Height(),LR_CREATEDIBSECTION
|LR_LOADFROMFILE);
读取失败,返回NULL。
调用GetLastError()函数显示信息为“存数空间不足,无法完成操作”。事实上我显示该图像的矩形较小,因而实际需要显示的只是它的压缩版本。但是现在根本无法读入,请各位大虾指点!谢谢!
4抽1就够了,变成1024*4973。
读出BITMAPFILEHEADER,改成新的值,再读出BITMAPINFOHEADER改成新值,都写到一个新的BMP文件中,然后一条一条的读扫描线,读4行留一行,留下的一行没4个像元留一个像元,都写到新的BMP文件里面。处理新的BMP文件就可以了。什么系统?Win7 x64处理这样的图像应该一次没问题。
我用如下代码进行您给的操作,但是生成的图像颜色出现了问题。不知道我这段代码是否正确?
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));
}
}
请指点,谢谢!