如题,自己按照参考代码试了一下发现图片是生成了,但是里面的图没有了,系统提示绘图失败,我将代码发布如下大家参考看看问题出在哪里: 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();
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();
bi1.biHeight = 210;
bi1.biSizeImage = (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * bi1.biHeight;
呵呵,我提楼上星星补充代码吧。
bi1.biHeight = 210;
后面加了一句
bi1.biSizeImage = (bi1.biWidth * bi1.biBitCount + 31) / 32 * 4 * bi1.biHeight;
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();