本将程序向明月,奈何程序不执行(附代码,提意见就送分)

jixuchen 2005-08-20 09:42:01
我想把原先的位图加宽,但是我在改了程序以后发现图像完全变形了;请问个位高手这是怎么回事啊??我的思路是先用一个指针把位图的头文件以及头文件信息和图像数据读出来,然后把该指针的内容复制到另外一个指针,相应的把新的指针的内容写到文件里,再通过一个循环把每行的宽加大,同时指针定位到相应的地方去修改位图的宽,最后保存成一张新的位图。
下附代码:
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;
}
...全文
103 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixuchen 2005-08-22
  • 打赏
  • 举报
回复
顶一下
一定要顶一下
因为我要知道这个问题的解决方法
jixuchen 2005-08-22
  • 打赏
  • 举报
回复
大哥帮帮忙啊
不能沉啊
怎么写怎么读啊 ??
讲明白点啊
vcmute 2005-08-20
  • 打赏
  • 举报
回复
循环for (int i=0; i < nHeight; i++)并没有把每行的宽加大
且这种加宽一般是通过两个文件读写(一个读一个写),然后覆盖
vcmute 2005-08-20
  • 打赏
  • 举报
回复
pInfoHead->biSizeImage = nHeight * pInfoHead->biWidth//256色的?若是需要调色板,如果不是要*bitCount<<3
注:pInfoHead->biWidth如果不是4的倍数,可能出现问题
jixuchen 2005-08-20
  • 打赏
  • 举报
回复
是24位真彩的,其他没什么错的吗?
能否帮忙改下?如何通过两个文件实现,可否提供代码或思想
不甚感激!!!
jack_xc@126.com
可以指教我一下不?非常感谢!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧