在 OnPaint 的函数中 直接加载图片到DC上
CPaintDC dc(this);
CRect m_PictureRect;
GetClientRect(m_PictureRect);
Gdiplus::Rect rccd;
Graphics graphics(dc.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic(_T("ico_tip.png")); 是PNG 的图片
graphics.DrawImage(&imagePic, rccd);
和缓冲一次在加载到DC上效果不一样?(图片周围有少量的黑色)
CPaintDC dc(this);
CRect m_PictureRect;
GetClientRect(m_PictureRect);
CDC SaveDC;
SaveDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,m_PictureRect.Width(),m_PictureRect.Height());
SaveDC.SelectObject(bitmap);
Gdiplus::Rect rccd;
Graphics graphics(SaveDC.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic(_T("ico_tip.png"));
graphics.DrawImage(&imagePic, rccd);
dc.TransparentBlt(0,0,m_PictureRect.Width(),m_PictureRect.Height(),&SaveDC,0,0,m_PictureRect.Width(),m_PictureRect.Height(),RGB(0,0,0));
大神们 帮帮小弟把 怎么解决啊?
CPaintDC dc(this);
CRect m_PictureRect;
GetClientRect(m_PictureRect);
Gdiplus::Rect rccd;
Graphics graphics(dc.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic(_T("ico_tip.png")); 是PNG 的图片
graphics.DrawImage(&imagePic, rccd);
和缓冲一次在加载到DC上效果不一样?(图片周围有少量的黑色)
CPaintDC dc(this);
CRect m_PictureRect;
GetClientRect(m_PictureRect);
CDC SaveDC;
SaveDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,m_PictureRect.Width(),m_PictureRect.Height());
SaveDC.SelectObject(bitmap);
Gdiplus::Rect rccd;
Graphics graphics(SaveDC.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic(_T("ico_tip.png"));
graphics.DrawImage(&imagePic, rccd);
dc.TransparentBlt(0,0,m_PictureRect.Width(),m_PictureRect.Height(),&SaveDC,0,0,m_PictureRect.Width(),m_PictureRect.Height(),RGB(0,0,0));
大神们 帮帮小弟把 怎么解决啊?
rccd.Y = 0;
rccd.Y = m_PictureRect.top;
其实就是
rccd.X = 0;
rccd.Y = 0;
我觉得是经过一次缓冲后 图片周围的像素值改变了
==你这个代码把黑色透明掉了啊
void C**View::OnDraw( CDC* pDC )
{
C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc );
CRect m_PictureRect;
GetClientRect(m_PictureRect);
Gdiplus::Rect rccd;
Graphics graphics( pDC->m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic( L"2.png" );
graphics.DrawImage(&imagePic, rccd);
}
代码1效果图:测试代码2:
void CMSPrintView::OnDraw( CDC* pDC )
{
CMSPrintDoc* pDoc = GetDocument( ); ASSERT_VALID( pDoc ); CRect m_PictureRect;
GetClientRect(m_PictureRect);
CDC SaveDC;
SaveDC.CreateCompatibleDC( pDC );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( pDC, m_PictureRect.Width( ), m_PictureRect.Height( ) );
SaveDC.SelectObject(bitmap);
Gdiplus::Rect rccd;
Graphics graphics(SaveDC.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic( L"2.png" );
graphics.DrawImage(&imagePic, rccd); pDC->BitBlt( 0, 0, m_PictureRect.Width( ), m_PictureRect.Height( ), &SaveDC, 0, 0, SRCCOPY );}
代码2效果图:我这样的测试应该没有违背楼主的主要意图。
从测试结果来看,楼主的主要问题是,在调用dc.TransparentBlt之前,你不进行内存绘图和进行内存绘图时,源DC得到的是两张不同的图,一个背景为白色,一个背景为黑色。这对dc.TransparentBlt的影响就是会产生黑边。
我想楼主应该明白怎么做了,呵呵 代码:
void CMSPrintView::OnDraw( CDC* pDC )
{
C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc ); CRect m_PictureRect;
GetClientRect(m_PictureRect);
CDC SaveDC;
SaveDC.CreateCompatibleDC( pDC );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( pDC, m_PictureRect.Width( ), m_PictureRect.Height( ) );
SaveDC.SelectObject(bitmap);
SaveDC.FillSolidRect( 0, 0, m_PictureRect.Width( ), m_PictureRect.Height( ), RGB( 255,255,255 ) );
Gdiplus::Rect rccd;
Graphics graphics(SaveDC.m_hDC);
rccd.X = m_PictureRect.left;
rccd.Y = m_PictureRect.top;
rccd.Width = m_PictureRect.Width();
rccd.Height = m_PictureRect.Height();
Image imagePic( L"2.png" );
graphics.DrawImage(&imagePic, rccd); pDC->BitBlt( 0, 0, m_PictureRect.Width( ), m_PictureRect.Height( ), &SaveDC, 0, 0, SRCCOPY ); DrawTransBitmap( pDC->m_hDC, 0, 0, m_PictureRect.Width( ), m_PictureRect.Height( ), SaveDC.m_hDC, 0, 0, RGB( 24, 24, 24 ) ); //pDC->TransparentBlt(0,0,m_PictureRect.Width(),m_PictureRect.Height(),&SaveDC,0,0,m_PictureRect.Width(),m_PictureRect.Height(),RGB(0,0,0));
}
SaveDC.FillSolidRect( 0, 0, m_PictureRect.Width( ), m_PictureRect.Height( ), RGB( 255,255,255 ) );这一句加上试试。
出现黑边的原因是你PNG边缘是有一定透明度的,叠加白色和叠加黑色后,去除黑色没有去除干净。
学习中~~~
你自己构造出来的DC默认填充的未必一定是黑色,需要你自己去填充这个DC,完了之后就没问题了。
有边缘没有透明度的PNG图片吗 我换了好多图片都有这个问题。还有这个和9楼的贴底图的思路差不过,有没有办法不贴底图,也就说 叠加白色或叠加黑色后 能完全去除白色和黑色?
2. 你出现“周围有少量的黑色”的本质原因在于TransparentBlt。这个函数会进行掩码处理(在2D游戏人物贴图中经常使用),可以达到背景透明的效果。
3. 使用这种掩码处理的图片必须满足一个条件:图片的前景部分绝对不能包含和背景色相同的颜色RGB,否则就是你所描述的效果。
4. 要解决这个问题,两个选择:(1) 不做掩码处理,直接BitBlt或者StretchBlt,但贴图的背景色全部选用同一种颜色,且不能有区域重叠 (2)做掩码处理,但请专门搞美工的处理下图片,使得处理过的图片满足3中的条件。总之不管怎么解,都得从图源下手,图源不行的话,你的算法再牛逼也没用。