本将程序向明月,奈何程序不执行(附代码,提意见就送分)
我想把原先的位图加宽,但是我在改了程序以后发现图像完全变形了;请问个位高手这是怎么回事啊??我的思路是先用一个指针把位图的头文件以及头文件信息和图像数据读出来,然后把该指针的内容复制到另外一个指针,相应的把新的指针的内容写到文件里,再通过一个循环把每行的宽加大,同时指针定位到相应的地方去修改位图的宽,最后保存成一张新的位图。
下附代码:
BOOL CBmpDlg::SaveBitmapFile(CString strFileName,CBitmap& bmp)
{
BITMAP bm;
bmp.GetBitmap (&bm);
int nWidth = bm.bmWidth;
int nHeight = bm.bmHeight;
int nLineBits = bm.bmWidthBytes;
int nBitCounts = nLineBits * bm.bmHeight;
int nBits = bm.bmBitsPixel;
int nBitmapInfoSize = 0;
nBitmapInfoSize = sizeof(BITMAPINFOHEADER);
BYTE* pBits = NULL;
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_FIXED, nBitCounts);
pBits = (BYTE *)::GlobalLock(hGlobal);
ZeroMemory((void *)pBits,nBitCounts);
BITMAPINFO* pbmpinfo = NULL;
pbmpinfo =(BITMAPINFO *)(new BYTE[nBitmapInfoSize]);
ZeroMemory((void *)pbmpinfo,nBitmapInfoSize);
BYTE* pBits2 = NULL;
pBits2 = new BYTE[2 * nBitCounts + sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER)];
BITMAPINFOHEADER* pInfoHead = (BITMAPINFOHEADER *)pbmpinfo;
ZeroMemory((void *)pInfoHead,sizeof(BITMAPINFOHEADER));
pInfoHead->biSize = sizeof(BITMAPINFOHEADER);
pInfoHead->biBitCount = nBits;
pInfoHead->biPlanes = 1;
pInfoHead->biSizeImage = nBitCounts;
pInfoHead->biCompression = BI_RGB;
pInfoHead->biWidth = nWidth;
pInfoHead->biHeight = nHeight;
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
int nLx = dc.GetDeviceCaps (LOGPIXELSX);
int nLy = dc.GetDeviceCaps (LOGPIXELSY);
double dbInchPerMeter = 39.375;
int nPMx = (int)((double)nLx * dbInchPerMeter);
int nPMy = (int)((double)nLy * dbInchPerMeter);
pInfoHead->biXPelsPerMeter = nPMx;//3780;
pInfoHead->biYPelsPerMeter = nPMy;//3780;
GetDIBits(dc.m_hDC,(HBITMAP)bmp,0,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);
BITMAPFILEHEADER bmfHeader;
int nFileHeadSize = sizeof(BITMAPFILEHEADER);
ZeroMemory((void *)&bmfHeader,sizeof(BITMAPFILEHEADER));
bmfHeader.bfType = 19778; //'BM'
bmfHeader.bfSize = nFileHeadSize + nBitmapInfoSize + nBitCounts;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + nBitmapInfoSize;
CFile file;
file.Open (strFileName,CFile::modeCreate | CFile::modeReadWrite);
file.SeekToBegin();
file.Read (&bmfHeader,sizeof(BITMAPFILEHEADER));
file.Read (pbmpinfo,nBitmapInfoSize);
pInfoHead->biWidth = nWidth + 12;//加宽
pInfoHead->biHeight = nHeight + 12; //加高
pInfoHead->biSizeImage = nHeight * pInfoHead->biWidth;//修改相应的图像数据
bmfHeader.bfSize = nFileHeadSize + nBitmapInfoSize + (nHeight * pInfoHead->biWidth);
file.SeekToBegin ();
memcpy (pBits2,&bmfHeader,sizeof(BITMAPFILEHEADER));
file.Write (pBits2,sizeof(BITMAPFILEHEADER));
file.Seek (sizeof(BITMAPFILEHEADER),CFile::begin);
memcpy (pBits2,pbmpinfo,nBitmapInfoSize);
file.Write (pBits2,nBitmapInfoSize);
for (int i=0; i < nHeight; i++)
{
file.Seek(54 + i * nLineBits , CFile::begin);
file.Read(pBits, nLineBits);
file.Seek(54 + i * nLineBits,CFile::begin);
memcpy(pBits2,pBits,nLineBits);
file.Write(pBits2,nLineBits);
}
file.Close ();
::GlobalUnlock (hGlobal);
::GlobalFree (hGlobal);
delete[] pBits2;
delete[] pbmpinfo;
return TRUE;
}