Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
先贴一张效果图,这是一张手机截屏:
左上方的风景图:背景图片
右上方的人物图:前景图片
左边心型透明图:相框图片
右边心型黑色图:蒙板图片
功能:把前景图应用蒙板,添加相框效果,合成到后景图上面:
结果就是下面的那张图片了。
还有一种是透明度渐变的,效果图如下:
因为只有透明度渐变,没有相框。但实现上基本一样。
下面是实现过程,直接贴代码吧,其中写了比较详细的注释。只有一个文件,如下:
- package com.example.androiddemo;
- import android.os.Bundle;
- import android.os.Environment;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- public class MainActivity extends Activity {
- private static final String TAG = "liuzw";
- private ImageView picBGView;
- private ImageView pictureView;
- private ImageView maskView;
- private ImageView frameView;
- private ImageView resultView;
- private Button startProcess;
- private Bitmap picBitmap;
- private Bitmap maskBitmap;
- private Bitmap frameBitmap;
- private Bitmap resultBitmap;
- private Bitmap fengjingBitmap;
- private Bitmap composedBitmap;
- private final int WITHOUT = -1;
- private static final int FRAME = 0;
- private static final int MASK = 1;
- // private int[] resIds = new int[]{ //斜框锯齿
- // R.drawable.pip_6_frame,
- // R.drawable.pip_6_frame_mask,
- // };
- // private int[] resIds = new int[]{ //胶条
- // R.drawable.pip_1_frame,
- // R.drawable.pip_1_frame_mask,
- // };
- private int[] resIds = new int[]{ //渐变
- WITHOUT,
- R.drawable.pip_2_frame_mask,
- };
- // private int[] resIds = new int[]{ //心形
- // R.drawable.pip_3_frame,
- // R.drawable.pip_3_frame_mask,
- // };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- picBGView = (ImageView) findViewById(R.id.pic_bg);
- picBGView.setImageResource(R.drawable.fengjing);
- pictureView = (ImageView) findViewById(R.id.pic);
- pictureView.setImageResource(R.drawable.pip_test);
- maskView = (ImageView) findViewById(R.id.mask);
- maskView.setImageResource(resIds[MASK]);
- frameView = (ImageView) findViewById(R.id.frame);
- frameView.setImageResource(resIds[FRAME]);
- startProcess = (Button) findViewById(R.id.btnStart);
- startProcess.setOnClickListener(mListener);
- resultView = (ImageView) findViewById(R.id.showResult);
- }
- /**
- * 获得前置照片
- */
- private void getFrontPicture(){
- //蒙板的Bitmap
- if(maskBitmap == null || maskBitmap.isRecycled() && resIds[MASK] != WITHOUT){
- maskBitmap = BitmapFactory.decodeResource(this.getResources(), resIds[MASK]);
- }
- if(maskBitmap == null) return;
- //前置的原图,并将其缩放到跟蒙板大小一直
- if(picBitmap == null || picBitmap.isRecycled()){
- picBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pip_test);
- picBitmap = Bitmap.createScaledBitmap(picBitmap, maskBitmap.getWidth(), maskBitmap.getHeight(), false);
- }
- //相框的Bitmap
- if(frameBitmap == null || frameBitmap.isRecycled() && resIds[FRAME] != WITHOUT){
- frameBitmap = BitmapFactory.decodeResource(this.getResources(), resIds[FRAME]);
- }
- int w = maskBitmap.getWidth();
- int h = maskBitmap.getHeight();
- int edgeColor = maskBitmap.getPixel(1, 1);
- int centerColor = maskBitmap.getPixel(w/2, h/2);
- Log.d(TAG, "edgeColor = " + Integer.toHexString(edgeColor) + ", centerColor = " + Integer.toHexString(centerColor));
- if(resultBitmap == null){
- resultBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- }
- //这是背景的风景图
- if(fengjingBitmap == null){
- fengjingBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fengjing);
- }
- //前置相片添加蒙板效果
- int[] picPixels = new int[w*h];
- int[] maskPixels = new int[w*h];
- picBitmap.getPixels(picPixels, 0, w, 0, 0, w, h);
- maskBitmap.getPixels(maskPixels, 0, w, 0, 0, w, h);
- for(int i = 0; i < maskPixels.length; i++){
- if(maskPixels[i] == 0xff000000){
- picPixels[i] = 0;
- }else if(maskPixels[i] == 0){
- //donothing
- }else{
- //把mask的a通道应用与picBitmap
- maskPixels[i] &= 0xff000000;
- maskPixels[i] = 0xff000000 - maskPixels[i];
- picPixels[i] &= 0x00ffffff;
- picPixels[i] |= maskPixels[i];
- }
- }
- //生成前置图片添加蒙板后的bitmap:resultBitmap
- resultBitmap.setPixels(picPixels, 0, w, 0, 0, w, h);
- }
- /**
- * 图片合成
- */
- private void compose(){
- if(fengjingBitmap == null || fengjingBitmap.isRecycled()){
- Log.e(TAG, "compose ERROR: fengjingBitmap is not valuable");
- return;
- }
- composedBitmap = Bitmap.createBitmap(fengjingBitmap.getWidth(), fengjingBitmap.getHeight(), Bitmap.Config.ARGB_8888);
- if(composedBitmap == null || composedBitmap.isRecycled()){
- Log.e(TAG, "compose ERROR: composedBitmap is not valuable");
- return;
- }
- if(resultBitmap == null || resultBitmap.isRecycled()){
- Log.e(TAG, "compose ERROR: resultBitmap is not valuable");
- return;
- }
- Canvas cv = new Canvas(composedBitmap);
- cv.drawBitmap(fengjingBitmap, 0, 0, null);
- cv.drawBitmap(resultBitmap, 100, 100, null);
- if(frameBitmap != null && !frameBitmap.isRecycled()){
- cv.drawBitmap(frameBitmap, 100, 100, null);
- }
- cv.save(Canvas.ALL_SAVE_FLAG);
- cv.restore();
- resultView.setImageBitmap(composedBitmap);
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- //释放资源
- resultView.setImageBitmap(null);
- if(picBitmap != null && !picBitmap.isRecycled()){
- picBitmap.recycle();
- picBitmap = null;
- }
- if(maskBitmap != null && !maskBitmap.isRecycled()){
- maskBitmap.recycle();
- maskBitmap = null;
- }
- if(frameBitmap != null && !frameBitmap.isRecycled()){
- frameBitmap.recycle();
- frameBitmap = null;
- }
- if(resultBitmap != null && !resultBitmap.isRecycled()){
- resultBitmap.recycle();
- resultBitmap = null;
- }
- if(fengjingBitmap != null && !fengjingBitmap.isRecycled()){
- fengjingBitmap.recycle();
- fengjingBitmap = null;
- }
- if(composedBitmap != null && !composedBitmap.isRecycled()){
- composedBitmap.recycle();
- composedBitmap = null;
- }
- }
- private OnClickListener mListener = new OnClickListener(){
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch(v.getId()){
- case R.id.btnStart:
- getFrontPicture();
- compose();
- break;
- }
- }
- };
- }
为了完整和方便参考,把布局文件也贴一下,如下:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#ffffffff"
- tools:context=".MainActivity" >
- <LinearLayout
- android:id="@+id/views1"
- android:layout_width="match_parent"
- android:layout_height="150dip"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/pic_bg"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1.0" />
- <ImageView
- android:id="@+id/pic"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1.0" />
- </LinearLayout>
- <LinearLayout
- android:id="@+id/views2"
- android:layout_below="@+id/views1"
- android:layout_width="match_parent"
- android:layout_height="150dip"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/frame"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1.0" />
- <ImageView
- android:id="@+id/mask"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1.0" />
- </LinearLayout>
- <Button
- android:id="@+id/btnStart"
- android:layout_below="@+id/views2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Start" />
- <ImageView
- android:id="@+id/showResult"
- android:layout_below="@+id/btnStart"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现的更多相关文章
- 【Anroid界面实现】WindowManager类使用具体解释——用户首次打开APP的使用教学蒙板效果实现
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在上一篇的文章中,我们介绍了怎样实现桌面悬浮窗体,在这个效果的实现过程中.最重要的一个类就是WindowMa ...
- android 图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- android图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- android 图片特效处理之 光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- android 图片特效处理之光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- android图片特效处理之光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- android 图片合成
package com.ebensz.eink.demo; import java.io.File; import java.io.FileOutputStream; import android.a ...
- WPF蒙板弹窗
由于界面设计需要,要给弹窗添加蒙板效果,在百度和google搜索了半天,竟然没有一个满意的方案,最后只能自己想办法实现了一个,原理还是比较简单的,现在分享给大家. 先看一下效果.. 原理其实 ...
- SVG 2D入门9 - 蒙板
SVG支持的蒙板 SVG支持多种蒙板特效,使用这些特性,我们可以做出很多很炫的效果.至于中文中把mask叫做"蒙板"还是"遮罩"就不去区分了,这里都叫做蒙板吧. ...
随机推荐
- BZOJ1089: [SCOI2003]严格n元树
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 762 Solved: 387[Submit][Status ...
- MVC4.0系统开发新手历程(二)
登录页 首先声明登录页不是我开发完成的 所以就简单的发下供大家参考 思路:由于是奖金系统,里面涉及到Money,所以在验证方面上下了很大的功夫,我看了下 主要的思想是 获取到那几个人会用到这个系统,然 ...
- 读书笔记:java并发
java中主要的同步机制是关键字synchronized,它提供一种独占锁,但是 同步这个术语还包括validate类型的变量,显示锁(Explicit Lock)以及原子变量. -------显示锁 ...
- 终极二分查找--传说十个人写九个有bug
之前写过一篇极为罗嗦的二分查找,非常得意地以为以后就可以避免踩坑了,但是今天才知道二分查找可以写的既简洁又鲁棒,唉!还是要多学习啊! 给一个按照从大到小的顺序排序好的数组a[]={1,2,3,4,7, ...
- github atom 试用
github的编辑器atom 1.0已经出来了,在https://atom.io/ 我之前在win上一直用notepad++写了两年脚本.最近改写lua了,项目组统一用的sublime text.su ...
- qt动态更新界面的菜鸟代码,请指出
qt简单界面更新代码(菜鸟级)(部分代码) self.timers_1=QtCore.QTimer(self) self.timers_1.timeout.connect(self.min_1) se ...
- spring+hibernate整合:报错org.hibernate.HibernateException: No Session found for current thread
spring+hibernate整合:报错信息如下 org.hibernate.HibernateException: No Session found for current thread at o ...
- Power Designer - 反向获取数据库物理模型时Unable to list the users 异常
解决方案: 菜单栏 -> Database -> Change Current DBMS ,给DBMS选择Oracle Version 9i2.
- TravelCMS旅游网站系统诞生记
本人就是一纯粹码农,没什么学历,更没什么技术,但是自认为学习能力还不错,近期有一个旅游网站系统项目正在进行中,在此以贴图记录这个项目的诞生过程,本是一个定制系统,但是不想把系统做死,以通用产品的标准来 ...
- SpinLock(自旋锁)
SpinLock(自旋锁) SpinLock 结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转. 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型 ...