写了一个图片任意拉伸的处理,但效率比较低,有没有谁能帮优化一下:
CDC *dc=GetDC();
CRect rc;
GetWindowRect(rc);
CDC BufferDC;
BufferDC.CreateCompatibleDC(dc);
CBitmap BufferBmp;
BufferBmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
BufferDC.SelectObject(&BufferBmp);
BufferDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255)); CDC pdc;
pdc.CreateCompatibleDC(&BufferDC);
pdc.SelectObject(&bitmap);
BITMAP bp;
bitmap.GetBitmap(&bp); //bitmap 是一个 CBitmap 对象 float w=bp.bmWidth;
float h=bp.bmHeight; for(UINT i=0;i<w-1;i++)
{ PointF p1,p2;
float cx=pt[1].X-pt[0].X;
float cy=pt[1].Y-pt[0].Y; float cw=cx/w; p1.X=cx*i/w+pt[0].X;p1.Y=cy*i/w+pt[0].Y; //相对 pt0
cx=pt[3].X-pt[2].X;
cy=pt[3].Y-pt[2].Y; if(cx/w>cw)cw=cx/w; p2.X=cx*i/w+pt[2].X;p2.Y=cy*i/w+pt[2].Y; //相对 pt2
for(UINT j=0;j<h-1;j++)
{
COLORREF c=pdc.GetPixel(i,j);
float x,y;
cx=p2.X-p1.X;
cy=p2.Y-p1.Y;
float ch=cy/h;
x=cx*j/h+p1.X;y=cy*j/h+p1.Y;
BufferDC.FillSolidRect(x,y,cw+1,ch+1,c);
}
}
dc->BitBlt(0,0,rc.Width(),rc.Height(),&BufferDC,0,0,SRCCOPY);
pdc.DeleteDC(); BufferDC.DeleteDC();
BufferBmp.DeleteObject(); dc->MoveTo(pt[0].X,pt[0].Y);
dc->LineTo(pt[1].X,pt[1].Y);
dc->LineTo(pt[3].X,pt[3].Y);
dc->LineTo(pt[2].X,pt[2].Y);
dc->LineTo(pt[0].X,pt[0].Y); dc->FillSolidRect(pt[0].X-2,pt[0].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[1].X-2,pt[1].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[2].X-2,pt[2].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[3].X-2,pt[3].Y-2,5,5,RGB(0,0,0));
ReleaseDC(dc);
CDC *dc=GetDC();
CRect rc;
GetWindowRect(rc);
CDC BufferDC;
BufferDC.CreateCompatibleDC(dc);
CBitmap BufferBmp;
BufferBmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
BufferDC.SelectObject(&BufferBmp);
BufferDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255)); CDC pdc;
pdc.CreateCompatibleDC(&BufferDC);
pdc.SelectObject(&bitmap);
BITMAP bp;
bitmap.GetBitmap(&bp); //bitmap 是一个 CBitmap 对象 float w=bp.bmWidth;
float h=bp.bmHeight; for(UINT i=0;i<w-1;i++)
{ PointF p1,p2;
float cx=pt[1].X-pt[0].X;
float cy=pt[1].Y-pt[0].Y; float cw=cx/w; p1.X=cx*i/w+pt[0].X;p1.Y=cy*i/w+pt[0].Y; //相对 pt0
cx=pt[3].X-pt[2].X;
cy=pt[3].Y-pt[2].Y; if(cx/w>cw)cw=cx/w; p2.X=cx*i/w+pt[2].X;p2.Y=cy*i/w+pt[2].Y; //相对 pt2
for(UINT j=0;j<h-1;j++)
{
COLORREF c=pdc.GetPixel(i,j);
float x,y;
cx=p2.X-p1.X;
cy=p2.Y-p1.Y;
float ch=cy/h;
x=cx*j/h+p1.X;y=cy*j/h+p1.Y;
BufferDC.FillSolidRect(x,y,cw+1,ch+1,c);
}
}
dc->BitBlt(0,0,rc.Width(),rc.Height(),&BufferDC,0,0,SRCCOPY);
pdc.DeleteDC(); BufferDC.DeleteDC();
BufferBmp.DeleteObject(); dc->MoveTo(pt[0].X,pt[0].Y);
dc->LineTo(pt[1].X,pt[1].Y);
dc->LineTo(pt[3].X,pt[3].Y);
dc->LineTo(pt[2].X,pt[2].Y);
dc->LineTo(pt[0].X,pt[0].Y); dc->FillSolidRect(pt[0].X-2,pt[0].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[1].X-2,pt[1].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[2].X-2,pt[2].Y-2,5,5,RGB(0,0,0));
dc->FillSolidRect(pt[3].X-2,pt[3].Y-2,5,5,RGB(0,0,0));
ReleaseDC(dc);
解决方案 »
- 关于改变其他进程子窗口上控件的内容改变
- VB做的应用程序调用VC做的ActiveX控件中BSTR类型的属性,遇到的怪异问题!
- 请教:在RichEdit文本框中如何实现不同字符串用不同颜色输出?在线等!
- error C2065: 'FtpCommand' : undeclared identifier
- 一个关于虚拟内存的问题,求助~~急
- CEdit问题
- 救命啊!请问如何用VC编程获取局域网上其他机器发出的http请求?
- 怎么样链接C运行库,而不需要DllMain()?
- 如何改变toolbar的背景色?
- 100分,手头有一段crc16代码,如何验证它算的crc?
- 写了一个图片任意位伸的处理,求效率问题
- 如何去掉程序在工具栏的系统菜单
具体情况具体对待,一般情况下不要写在OnPaint里
介绍一下你出现的问题
现在的问题是,代码运行是正常的,但效率很低,如果图片是800*600大小,在i3-380M的机器上,要运行3-5秒才能出结果。已经使用了双缓冲,否则要10秒左右