透明贴图的小黑线

miliggate 2012-08-07 05:19:15
今天画了一个透明贴图,
用CImage画的,在暗色调的图片上没有问题,但是在亮色调的图片上就会莫名其妙的出现黑框,
不知道怎么结局


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;
}
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
miliggate 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
引用 3 楼 的回复:

刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不……
[/Quote]
我这个Ps出来的,黑色边框是自己填充的
NexTor 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不会出现了一些值得偏移,具体可能……
[/Quote]
现在的问题是这个黑线是怎么来的,是jpg图片上画了黑色的边框,然后用作透明用吗
NexTor 2012-08-08
  • 打赏
  • 举报
回复
刚才改成bmp的图片做了一下实验,发现bmp的一点问题都没有,直接在bmp上涂黑,然后能透明输出。
你调查一下jpg压缩的原理吧,看是不是压缩后的图像会不会改变像素点的像素值。
miliggate 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不会出现了一些值得偏移,具体可能和jpg压缩算法有关吧,这我……
[/Quote]
只要去掉黑边我的程序就会好看很多啊
NexTor 2012-08-08
  • 打赏
  • 举报
回复
刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是RGB(0,0,0)的,会不会出现了一些值得偏移,具体可能和jpg压缩算法有关吧,这我没有了解过。

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();
}
NexTor 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:

引用 4 楼 的回复:
引用 3 楼 的回复:

刚才实现了一下,我发现我将jpg图片的一部分涂黑,然后用TransparentBlt画确实有些地方透明了,而有些地方存在好多黑色,但是我将jpg图片读入后,用fillSolidRect画成部分黑色的,然后TransparentBlt画是能实现透明的效果的。我猜是不是jpg图片压缩后,图像的黑色部分像素并不是全是R……
[/Quote]
就是因为你PS出来的,画的是黑色的边框,但是变成jpg图片后,那个黑色的边框不一定是黑色的,可能变成RGB(1,0,0)什么的颜色,所以你用transparentBlt让边框透明的时候并不能透过去,所以会留下黑色的线条。
miliggate 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

那说明在暗色的也有只不过眼睛分辨不出来罢了
[/Quote]
但是白色的图片却也很多,有黑线也很蛋疼
  • 打赏
  • 举报
回复
那说明在暗色的也有只不过眼睛分辨不出来罢了

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧