GDI+实现半透明的问题?

yuliangpei 2004-10-15 04:45:35
现有一张单色的黑白单象素(相邻象素的颜色均不同)相间的位图一张,导入到资源当中.资源标识符为IDB_PATTERN.用gdi实现半透明了红色半透明的效果.我现在想用GDI+来实现目前的GDI功能,不知道如何去做,请高手指教!GDI实现的源码如下:
CDC *pMDC;
pMDC = GetDC();
CRect rect(10, 10, 100, 100);
CBitmap bmp;
bmp.LoadBitmap(IDB_PATTERN);

CBrush brhBmpBrush, brhRedBrush;
CBrush *pOldBrush;
brhBmpBrush.CreatePatternBrush(&bmp);
brhRedBrush.CreateSolidBrush(RGB(0xFF, 0x0, 0x0));

pOldBrush = (CBrush *)pMDC->SelectObject(&brhRedBrush);
pMDC->SetBkColor(RGB(0, 0, 0));
pMDC->SetROP2(R2_XORPEN);
pMDC->Rectangle(&rect);

pMDC->SelectObject(brhBmpBrush);
pMDC->SetBkColor(RGB(0xFF, 0xFF, 0xFF));
pMDC->SetROP2(R2_MASKPEN);
pMDC->Rectangle(&rect);

pMDC->SelectObject(brhRedBrush);
pMDC->SetBkColor(RGB(0, 0, 0));
pMDC->SetROP2(R2_XORPEN);
pMDC->Rectangle(&rect);

pMDC->SelectObject(pOldBrush);
...全文
731 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
broadoceans 2004-10-28
  • 打赏
  • 举报
回复
如果要高效的话,得到数据区,应用MMX指令计算即可,这是目前最快的半透明方法了.
QSmile 2004-10-28
  • 打赏
  • 举报
回复
学习一下
cadinfo 2004-10-27
  • 打赏
  • 举报
回复
我好久没有用了,试试看修改colormatrix
以前看过例子的,应该能保证效率

另外broadoceans(broadoceans) 的方法显示缓慢,你可采用invalidate(FALSE)
不要使用TRUE,也就是不要擦除,重写覆盖即可。
yuliangpei 2004-10-22
  • 打赏
  • 举报
回复
再说一下我为什么要这么做,我的这个东西是一个打印驱动.当我们打印一个word半透明的方框时,word会按照我刚刚说的那个顺序传一些东西过来.但我不知道他接下来要传什么,更不知道哪些要合成在一起做什么.所以上面兄台说的都无法满足我的要求.
再和大家说一下我目前的解决办法吧!
我从当前的Graphics中提取一个DC(记为pDC吧),并将目标所在区域的DC图象BitBlt到另外一个pMemDC中,然后将所要进行的当前绘图操作都在pDC中完成,然后用相应的ROP操作将pMemDC再BitBlt到pDC中.这样就完成了不用Graphics来进行ROP操作.目前不知道是否所有的ROP都可以这样来实现,正在对打印过程中调用某些特殊ROP而GDIPlus无法实现的情况进行测试.
谢谢大家的回复!!!
yuliangpei 2004-10-22
  • 打赏
  • 举报
回复
我的GDI实现过程中,要将其当作只能知道当前的指令和先前的指令,不知道后面要做什么.如果我知道是实现半透明我就不用这么麻烦了.通过gdi+中的colormap直接就可以修改图像的颜色了.
但现在的关键问题就是我知道他要进行下面这个操作.
pOldBrush = (CBrush *)pMDC->SelectObject(&brhRedBrush);
pMDC->SetBkColor(RGB(0, 0, 0));
pMDC->SetROP2(R2_XORPEN);
pMDC->Rectangle(&rect);

可我不知道他还要进行
pMDC->SelectObject(brhBmpBrush);
pMDC->SetBkColor(RGB(0xFF, 0xFF, 0xFF));
pMDC->SetROP2(R2_MASKPEN);
pMDC->Rectangle(&rect);

pMDC->SelectObject(brhRedBrush);
pMDC->SetBkColor(RGB(0, 0, 0));
pMDC->SetROP2(R2_XORPEN);
pMDC->Rectangle(&rect);
这两个操作.
不知道我说的是否清楚.
wuzhiwen 2004-10-21
  • 打赏
  • 举报
回复
楼上的,方法可行,可效率太低了,在GDI+中用像素操作,那简直就没法忍受

GDI+ 中的Graphics可以实现你的功能,可你又不想用DC,何解?我有点不明白了
另外GDI+是没有ROP操作的
broadoceans 2004-10-17
  • 打赏
  • 举报
回复
Graphics graphics(HDC);
graphics.TranslateTransform(50, 50);
Bitmap background(L"background.jpg");
graphics.DrawImage(&background, 0, 0, 200, 200);
Bitmap forground(L"foreground.jpg");
graphics.DrawImage(&forground, 250, 0, 200, 200);
graphics.DrawImage(&background, 500, 0, 200, 200);
int width = forground.GetWidth();
int height = forground.GetHeight();
//分别设置前景图中的每一个像素的透明度
Color color, colorTemp;
for(int iRow = 0; iRow < height; iRow++)
{
for(int iColumn = 0; iColumn < width; iColumn++)
{
forground.GetPixel(iColumn, iRow, &color);
colorTemp.SetValue(color.MakeARGB(
125, color.GetRed(), color.GetGreen(), color.GetBlue()));
forground.SetPixel(iColumn, iRow, colorTemp);
}
}
graphics.DrawImage(&forground, 500, 0, 200, 200);
yuliangpei 2004-10-17
  • 打赏
  • 举报
回复
没有人能指点一下吗?
yuliangpei 2004-10-15
  • 打赏
  • 举报
回复
这种不行,不能用上面这个转GDI+,我那个是word文档中半透明方框的打印时所得到的打印方式.word是通过我那种方式来实现半透明无边框矩形的.不过还是谢谢楼上!呵呵
DentistryDoctor 2004-10-15
  • 打赏
  • 举报
回复
void DrawSemiTransparentBitmap(CDC *pDstDC, int x, int y, int nWidth, int nHeight,
CDC* pSrcDC, int xSrc, int ySrc)
{
CDC dcCompatible;
CBitmap *pBitmapOld;
CBitmap bm;

dcCompatible.CreateCompatibleDC(pDstDC);
bm.CreateCompatibleBitmap(pDstDC, nWidth, nHeight);
pBitmapOld = dcCompatible.SelectObject(&bm);
dcCompatible.FillSolidRect(CRect(0, 0, nWidth, nHeight), RGB(0x7F, 0x7F, 0x7F));
pDstDC->BitBlt(x, y, nWidth, nHeight, &dcCompatible, 0, 0, SRCAND);
dcCompatible.SelectObject(pBitmapOld);

pDstDC->BitBlt(x, y, nWidth, nHeight, pSrcDC, 0, 0, SRCPAINT);
}

这也是GDI的!
yuliangpei 2004-10-15
  • 打赏
  • 举报
回复
我没有发现gdIplus中的rop操作,所以不知道怎么去做这个问题.gdiplus中可以通过graphics获得DC,从而实现相应功能,但我不想通过DC实现.

19,468

社区成员

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

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