概览:
- 采用Porter-Duff 图片合成方法
- 采用Shader着色器重新绘制图片
- 不规则图片裁剪
- 心形图片裁剪
- 参考链接
先看下效果:
1. 采用Porter-Duff 图片合成方法
先说说Porter-Duff是什么意思:Porter-Duff是Thomas Porter 和 Tom Duff 的简称,就是两个人名字的合成。
Porter-Duff 操作是 1 组 12 项用于描述数字图像合成的基本手法,包括
Clear、Source Only、Destination Only、Source Over、Source In、Source
Out、Source Atop、Destination Over、Destination In、Destination
Out、Destination Atop、XOR。通过组合使用 Porter-Duff 操作,可完成任意 2D
图像的合成。
合成图片,顾名思义就是拿两张图片取需要的部分放到第三张图片上,合成一张新的图片。
看看我们采用的两张图片吧:
绿色的mask并不会把小狗整成绿色,因为合成的时候只取了mask的形状,alpha值为0。代码如下:
|
|
合成之后就变成圆角图片了,如下:
原理: 我们先是用两张图片的最大尺寸创建了一个mutable
的Bitmap
,用来作为Canvas
的画东西的地方。然后先画了mask,即Dst
,接着把画笔Paint
的XFerMode
设置成SRC_ATOP
,然后把dog画上去,这样就实现了裁剪效果。
估计你不太理解我说的东西,看下面一张图你就明白了(蓝色正方形是Src
,就是你将要画上去的东西,黄色圆圈是Dst
,即原来画布上有的东西):
上面是一种合成方式,看另外一种合成方式:
好了,效果是达到了,但这样做有没有问题呢?问题如下:
- mask的尺寸必须和原图一致,我们当然可以缩放mask,但如果缩放的宽高比和原图不一致会出现失真。
- 最大的问题还是效率!为了实现裁剪,我们加载了两个图,如果图片很大就会
OutOfMemoryError
。
2. 采用Shader着色器重新绘制图片
Shaders
着色器让我们可以在画东西的时候定义填充风格,Shaders
是设置在画笔上的。BitmapShader
是用一张Bitmap
着色,而且还支持三种瓦片铺盖方式。所谓瓦片铺盖方式就是当我们画的区域比采用的Bitmap还大时,超出部分该怎么画。如下图(小方块就代表Bitmap
):
代码如下:
|
|
效果如下:
3. 不规则图片裁剪
对话框气泡,原理是一样的,看代码如下:
|
|
效果如下:
4. 心形图片裁剪
先设置BitmapShader
, Canvas
, 和 Paint
对象:
|
|
再初始化一些后面需要用到的东西:
|
|
把长方形变成椭圆:
|
|
得到如下图形:
旋转30度:
|
|
得到如下图形:
再用Region
裁剪:
|
|
得到如下图形:
同理再画另一边,画之前先复位:
|
|
|
|
得到如下图形:
全部代码放一起如下:
|
|
5. 参考链接
http://www.douban.com/note/143111853/