android中,如何用canvas绘制透明?

android中,如何用canvas绘制透明?,第1张

第一种思路是通过对Bitmap进行 *** 作,将Bitmap的像素值get到一个int[]数组里,因为在android里Bitmap通常是ARGB8888格式,所以最高位就是A通道的值,对齐进行改变后再新建一个Bitmap即可。

第二种思路是通过设置canvas的paint的透明度,然后通过canvas.drawBitmap()来改变View的透明度。

Paint .setAlpha(0)

窗体透明有两种实现方式:

① 比较简单的方法就两句话。

this.TransparencyKey = this.BackColor

this.FormBorderStyle = FormBorderStyle.None

适用于单色背景的窗体。

② 如果想要图片背景的窗体透明,就稍微有点复杂。

流程:获取图片不透明区域 ->设置 Form.Region 为该区域

◆ 首先需要定义两个函数

/// <summary>返回Region,表示由 不透明路线() 新建的区域</summary>

public Region 不透明区域(Bitmap 位图) { return new Region(不透明路线(位图))}

/// <summary>返回GraphicsPath,表示所有不透明的点组成的路线</summary>

public GraphicsPath 不透明路线(Bitmap 位图) {

  GraphicsPath gp = new GraphicsPath()//新建图像路径来存储不透明的点

  for (int x = 0x <源宽x++) {

      for (int y = 0y <源高y++) {

          Color c = 位图.GetPixel(x, y)

          if (c.A != 0) { gp.AddRectangle(new Rectangle(x, y, 1, 1))} //添加点到路径

      }

  }

  return gp//返回路径

}

◆ 获取图片的不透明区域,并将窗体区域设置为它

Bitmap 位图 = new Bitmap(@"C:\图片路径\123.png")

Region 保留区域 = 不透明区域(位图)

Form1.Region = 保留区域

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

尝试编写一个像QQ宠物一样浮在桌面上的动画。在网上找了一些资料,透明处理后整个对话框包括控件和加载的位图都变成透明的的了。当背景完全透明后就什么也看不见了。问下,怎么样才能只让背景透明,加载的位图或其他控件不透明呢?尽量给出例子。

解析:

crColour是位图中的透明色/

void CChessView::DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)

{

COLORREF crOldBack,crOldText

CDC dcImage,dcMask

CBitmap bmp

crOldBack=pDC->SetBkColor(RGB(255,255,255))RGB(0,0,0) 隐形色

crOldText=pDC->SetTextColor(RGB(0,0,0))RGB(255,255,255)

IDB_BITMAP4为待显示的位图

BITMAP bm

bmp.GetBitmap(&bm)

int nWidth=bm.bmWidth,nHeight=bm.bmHeight

为图象及mask各创建一个DC

dcImage.CreateCompatibleDC(pDC)

dcMask.CreateCompatibleDC(pDC)

把图象装入imageDC

CBitmap *pOldBitmapImage=dcImage.SelectObject(&bmp)

为“掩码”位图创建一个单 *** itmap

CBitmap bitmapMask

bitmapMask.CreateBitmap(nWidth,nHeight,1,1,NULL)把mask位图装入maskDC

CBitmap *pOldBitmapMask=dcMask.SelectObject(&bitmapMask)用透明色创建“掩码”位图

dcImage.SetBkColor(crColour)crColour是位图中的透明色

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)

dcImage.SelectObject(pOldBitmapMask)

pDC->SetBkColor(crOldBack)

pDC->SetTextColor(crOldText)

}

直接调用这个函数,CDC * pDC,我就不多介绍了,int x,int y是该位图的坐标,crColour是位图中的透明色。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7736265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存