VC6 中处理BMP图,急
现已有一幅BMP图,大小为800*600;
现需将它在内存中转换为1024*1024的图;
要求:不拉伸,将原图放在1024*1024的中间部位;
超出原图面积的区域,一律白色代替;
求思路及代码,请知道的朋友来指点一下;急~
[解决办法]
在内存中生成一张1024*1024的图,全白色
算坐标,在内存中把小图画在大图上
显示or保存
gdi
gdi+
cximage
都可以实现
[解决办法]
方法一
新建一个1024*1024的白色图,然后把你的bmp贴(bitblt)到相对中间的位置
方法二
填像素, 建个1024*1024的缓存 打开bmp 800*600的,对应位置填充像素,没有的给255
这个其实是生成了个新的bmp
[解决办法]
临时写了一个 试试看
void CenterBitmap( CBitmap &SrcBmp, CBitmap &DstBmp, const int cx, const int cy, const COLORREF backColor ){ //屏幕DC CDC *pScreenDC = CDC::FromHandle(CreateDC( _T("DISPLAY"), NULL, NULL, NULL )); //源DC CDC SrcDC; SrcDC.CreateCompatibleDC(pScreenDC); CBitmap *pOldSrcBmp = SrcDC.SelectObject(&SrcBmp); BITMAP SrcBmpInfo; //目标DC CDC DstDC; DstDC.CreateCompatibleDC(pScreenDC); DstBmp.DeleteObject(); DstBmp.CreateCompatibleBitmap(pScreenDC, cx, cy); CBitmap *pOldDstBmp = DstDC.SelectObject(&DstBmp); //计算坐标 SrcBmp.GetBitmap(&SrcBmpInfo); int CopyX = min(cx, SrcBmpInfo.bmWidth); int CopyY = min(cy, SrcBmpInfo.bmHeight); int SrcX = (cx > SrcBmpInfo.bmWidth) ? 0 : (SrcBmpInfo.bmWidth - cx)/2; int SrcY = (cy > SrcBmpInfo.bmHeight) ? 0 : (SrcBmpInfo.bmHeight - cy)/2; int DstX = (cx > SrcBmpInfo.bmWidth) ? (cx - SrcBmpInfo.bmWidth)/2 : 0; int DstY = (cy > SrcBmpInfo.bmHeight) ? (cy - SrcBmpInfo.bmHeight)/2 : 0; //填充背景 DstDC.FillSolidRect(0, 0, cx, cy, backColor); //贴图 DstDC.BitBlt(DstX, DstY, CopyX, CopyY, &SrcDC, SrcX, SrcY, SRCCOPY); //结束清理工作 DstDC.SelectObject(pOldDstBmp); DstDC.DeleteDC(); SrcDC.SelectObject(pOldSrcBmp); SrcDC.DeleteDC(); pScreenDC->DeleteDC();}
[解决办法]
不好意思,我的代码有问题,还是5楼的代码正确。我运行了一下发现我的代码必须改成这样才行。
CDC memDC; //在头文件中定义CDC *pDC=GetDC(); CDC bmpDC; memDC.CreateCompatibleDC(pDC); bmpDC.CreateCompatibleDC(pDC); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP_NAME); bmpDC.SelectObject(&bmp);bmp.DeleteObject();bmp.CreateCompatibleBitmap(pDC,1024,1024);memDC.SelectObject(&bmp);memDC.FillSolidRect(0,0,1024,1024,RGB(255,255,255));int xPos=(1024-800)/2;int yPos=(1024-600)/2;memDC.BitBlt(xPos,yPos,800,600,&bmpDC,0,0,SRCCOPY);