透明贴图的小黑线,该怎么解决
透明贴图的小黑线
今天画了一个透明贴图,
用CImage画的,在暗色调的图片上没有问题,但是在亮色调的图片上就会莫名其妙的出现黑框,
不知道怎么结局
------解决方案--------------------
刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不会出现了一些值得偏移,具体可能和jpg压缩算法有关吧,这我没有了解过。
今天画了一个透明贴图,
用CImage画的,在暗色调的图片上没有问题,但是在亮色调的图片上就会莫名其妙的出现黑框,
不知道怎么结局
- C/C++ code
if(!Is_rim) { CImage bk,t_bk; bk.Load(L"D:\\边框.jpg"); MakePerImg(&bk,&t_bk,img.GetWidth(),img.GetHeight()); /////////////////////////////// TransparentBlt(memdc.GetDC(),0,0,memdc.GetWidth(),memdc.GetHeight(),t_bk.GetDC(),0,0,t_bk.GetWidth(),t_bk.GetHeight(),RGB(0,0,0));//实现透明 t_bk.ReleaseDC(); memdc.ReleaseDC(); memdc.BitBlt(this->GetDC()->GetSafeHdc(),0,0); Is_rim=true; } else { Is_rim=false; update=true; }
------解决方案--------------------
刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不会出现了一些值得偏移,具体可能和jpg压缩算法有关吧,这我没有了解过。
- C/C++ code
void CDrawTestView::OnPaint() { CPaintDC dc(this); // device context for painting CImage bk,t_bk; bk.Load(L"D:\\aaa.jpg"); t_bk.Create(bk.GetWidth(), bk.GetHeight(), bk.GetBPP()); CDC* memdc = CDC::FromHandle(t_bk.GetDC()); memdc->FillSolidRect(0, 0, bk.GetWidth(), bk.GetHeight(), RGB(255, 255, 0)); CDC* backDC = CDC::FromHandle(bk.GetDC()); backDC->FillSolidRect(0, 0, bk.GetWidth() / 2, bk.GetHeight() / 2, RGB(0, 0, 0)); TransparentBlt(memdc->GetSafeHdc(),0,0,t_bk.GetWidth(),t_bk.GetHeight(),bk.GetDC(),0,0,bk.GetWidth(),bk.GetHeight(),RGB(0,0,0));//实现透明 BitBlt(dc.GetSafeHdc(), 0, 0, t_bk.GetWidth(), t_bk.GetHeight(), memdc->GetSafeHdc(), 0, 0, SRCCOPY); t_bk.ReleaseDC(); bk.ReleaseDC(); bk.ReleaseDC(); }