如题,自己按照参考代码试了一下发现图片是生成了,但是里面的图没有了,系统提示绘图失败,我将代码发布如下大家参考看看问题出在哪里:         BITMAPFILEHEADER   bmfHdr;       
BITMAPINFOHEADER   bi,   bi1;       
CFile   file("cuttest.bmp",   CFile::modeRead);   
file.Read(&bmfHdr,   sizeof(BITMAPFILEHEADER));   
file.Read(&bi,   sizeof(BITMAPINFOHEADER));   
DWORD   dwSize   =   (bi.biWidth   *   bi.biBitCount   +   31)   /   32   *   4   *   bi.biHeight;   
PBYTE   pBuf   =   new   BYTE[dwSize];   
file.Read(pBuf,   dwSize);   
file.Close();   
file.Open("Temp.bmp",   CFile::modeCreate   |   CFile::modeReadWrite);   
memcpy(&bi1,   &bi,   sizeof(BITMAPINFOHEADER));   
bi1.biWidth   =   280;   
bi1.biHeight   =  210;   
DWORD   dwSize1   =   (bi1.biWidth   *   bi1.biBitCount   +   31)   /   32   *   4   *   bi1.biHeight;   
PBYTE   pBuf1   =   new   BYTE[dwSize1];   
BYTE   *pSrc,   *pDest;   
for(int   i   =   0;   i   <   bi1.biHeight;   i++)   
{   
        pSrc   =   pBuf   +   (bi.biWidth   *   bi.biBitCount   +   31)   /   32   *   4   *   (bi.biHeight - bi1.biHeight+ i);   
        pDest   =   pBuf1   +   (bi1.biWidth   *   bi1.biBitCount   +   31)   /   32   *   4   *   i;   
        memcpy(pDest,   pSrc,   (bi1.biWidth   *   bi1.biBitCount   +   31)   /   32   *   4);   
}   
file.Write(&bmfHdr,   sizeof(BITMAPFILEHEADER));   
file.Write(&bi1,   sizeof(BITMAPINFOHEADER));   
file.Write(pBuf1,   dwSize1);   
file.Close();   

解决方案 »

  1.   

    你是直接修改文件内容,要不换一个方法,用LoadImage将位图加入到一个内存DC中,然后根据自定义大小来BitBlt到另一个内存DC,最后将后一个内存DC中的位图保存到文件中。
      

  2.   

    BITMAPINFOHEADER中的biSizeImage和BITMAPFILEHEADER中的bfSize都要改。
      

  3.   

    biSizeImage是表示图象数据的字节数,就是dwSize1;bfSize是文件大小,就是文件头+信息头+dwSize1。
      

  4.   

    bi1.biWidth  =   280;  
    bi1.biHeight  =  210;
    bi1.biSizeImage = (bi1.biWidth * bi1.biBitCount + 31)  /  32  *  4  *  bi1.biHeight;
    呵呵,我提楼上星星补充代码吧。
      

  5.   

    就是在 bi1.biWidth   =   280;   
    bi1.biHeight  =  210; 
    后面加了一句
             bi1.biSizeImage = (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * bi1.biHeight;
      

  6.   

    下面喂重新修改的代码:
             BITMAPFILEHEADER   bmfHdr;
    BITMAPINFOHEADER   bi,   bi1; 
    RGBQUAD rgb,rgb1;
    CFile   file("cuttest.bmp",   CFile::modeRead);   
    file.Read(&bmfHdr,   sizeof(BITMAPFILEHEADER));   //文件头
    file.Read(&bi,   sizeof(BITMAPINFOHEADER));//信息头
    file.Read(&rgb,   sizeof(RGBQUAD)*256);
    DWORD   dwSize   =   (bi.biWidth * bi.biBitCount + 31) / 32 * 4 * bi.biHeight;   
    PBYTE   pBuf   =   new   BYTE[dwSize];   
    file.Read(pBuf,   dwSize);   
    file.Close();

    file.Open("Temp.bmp",   CFile::modeCreate   |   CFile::modeReadWrite);   
    memcpy(&bi1,   &bi,   sizeof(BITMAPINFOHEADER));   
    bi1.biWidth   =  280;   
    bi1.biHeight  =  210; 
    bi1.biSizeImage = (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * bi1.biHeight;

    DWORD  dwSize1 =  (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * bi1.biHeight;   
    PBYTE  pBuf1 =   new BYTE[dwSize1];   
    BYTE   *pSrc,   *pDest;  

    for(int   i   =   0;   i   <   bi1.biHeight;   i++)   
    {   
            pSrc = pBuf + (bi.biWidth * bi.biBitCount + 31) / 32 * 4 * (bi.biHeight - bi1.biHeight + i);   
            pDest = pBuf1 + (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * i;   
            memcpy(pDest, pSrc, (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4);   
    }   
    file.Write(&bmfHdr, sizeof(BITMAPFILEHEADER));   
    file.Write(&bi1, sizeof(BITMAPINFOHEADER));  
    file.Write(&rgb1,   sizeof(RGBQUAD)*256);
    file.Write(pBuf1, dwSize1);   
    file.Close();   
      

  7.   

    在高手帮忙搞定了,感谢大家了!特别感谢laomao_hbu