怎样消除图片的锯齿?? 我在视图中用 TransparentBlt 显示一张BITMAP(周围显示成透明)但显示出来后有锯齿,请问怎样才能消除它或者能不能用别的图片格式呢(如果是别的格式要怎样做呢?最好能有源码),谢谢各位先!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 绘制"透明"位图的实际操作步骤是先将位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上,然后将"掩码"位图设备描述表以"SRCAND"的方式绘制(BitBlt)到显示设备描述表上,最后将位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上.这样除"透明色"外的其余位图部分就被绘制到窗口上了,下面是源码:void CTransparentPicView::DrawTransparent(CDC *pDC, int x, int y, COLORREF crColour){ COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255)); COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0)); CDC dcImage, dcMask; CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP1是待显示位图的资源ID BITMAP bm;bmp.GetBitmap(&bm); int nWidth=bm.bmWidth,nHeight=bm.bmHeight; //为图像及mask各创建一个DC dcImage.CreateCompatibleDC(pDC); dcMask.CreateCompatibleDC(pDC); //把图像装入image DC CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp); //为“掩码”位图创建一个单色bitmap CBitmap bitmapMask; bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位图装入mask DC CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色创建“掩码”位图 dcImage.SetBkColor(crColour);//crColor是位图中的透明色 dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步进行实际的绘制 pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); pDC->BitBlt(x, y, nWidth, nHeight, &dcMask, 0, 0, SRCAND); pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); //恢复原先设置 dcImage.SelectObject(pOldBitmapImage); dcMask.SelectObject(pOldBitmapMask); pDC->SetBkColor(crOldBack); pDC->SetTextColor(crOldText);}void CTransparentPicView::OnDraw(CDC* pDC){ CTransparentPicDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //画底层位图 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAP bm; bmp.GetBitmap(&bm); int nWidth=bm.bmWidth,nHeight=bm.bmHeight; CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap* pOldBmp = MemDC.SelectObject(&bmp); pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBmp); //画上层透明位图 DrawTransparent(pDC,0,0,RGB(0,0,0)); // TODO: add draw code for native data here}这样就OK了,试试吧^_^ 非常不容易做啊,呵呵如果用TransparentBlt就只能这样了如果你自己在内存中操作DIB的话倒是可以通过简单的图象算法处理一下,判定四向或八向方法对透明色边缘的象素与背景色求均值,这只是一种最简单的反走样思想,不过要做得好的话可不容易因为是位图所以只有判定象素如果是矢量图的话可以用 Intel 的图形库 谢谢各位!问题早已经解决了,我用的是GDI+ CFile 是对 CreateFile 的封装? MFC 延时处理仿QQ点击登录按钮之后等待连接的界面 VC6.0 如何把一个工程中的某个对话框资源移植到另外一个工程中 远程屏幕实时抓取 数据库数据显示错行 如何实现事件的像C#里+=动态绑定? 求个bmp转avi的vc程序 为什么找不到我需要的类??????? vc6.0连接access2003问题,弄得我要哭了。。 我靠!大家快来救我一命! 肯请帮忙解决vc6如何开发web的思路 请教几个报考公务员的问题
void CTransparentPicView::DrawTransparent(CDC *pDC, int x, int y, COLORREF crColour)
{
COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255));
COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0));
CDC dcImage, dcMask;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2);
//IDB_BITMAP1是待显示位图的资源ID
BITMAP bm;bmp.GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
//为图像及mask各创建一个DC
dcImage.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
//把图像装入image DC
CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
//为“掩码”位图创建一个单色bitmap
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位图装入mask DC
CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色创建“掩码”位图
dcImage.SetBkColor(crColour);//crColor是位图中的透明色
dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步进行实际的绘制
pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
pDC->BitBlt(x, y, nWidth, nHeight, &dcMask, 0, 0, SRCAND);
pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); //恢复原先设置
dcImage.SelectObject(pOldBitmapImage);
dcMask.SelectObject(pOldBitmapMask);
pDC->SetBkColor(crOldBack);
pDC->SetTextColor(crOldText);
}void CTransparentPicView::OnDraw(CDC* pDC)
{
CTransparentPicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//画底层位图
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
bmp.GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBmp = MemDC.SelectObject(&bmp);
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBmp);
//画上层透明位图
DrawTransparent(pDC,0,0,RGB(0,0,0)); // TODO: add draw code for native data here
}
这样就OK了,试试吧^_^
如果用TransparentBlt就只能这样了
如果你自己在内存中操作DIB的话倒是可以通过简单的图象算法处理一下,判定四向或八向方法对透明色边缘的象素与背景色求均值,这只是一种最简单的反走样思想,不过要做得好的话可不容易
因为是位图所以只有判定象素
如果是矢量图的话可以用 Intel 的图形库