android 以不规则图片为边框切割另外图片
转自:http://blog.sina.com.cn/s/blog_474928c90101dkvf.html
最近工作上遇到了一个将一个图片按照相框进行裁剪的问题,花了一个下午研究了下,在此整理一下,以便后用。
+
= 
package com.example.test_filter; import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Bitmap.Config; public class AlphaFilter implements Filter{ public static final int INSIDE_MODE = 0;
public static final int EDGE_MODE = 1;
public static final int OUTSIDE_MODE = 2; public int findNonOpaque(int x, int y, int width, int height, int[] srcPixels) {
if(width < height) {
return findNonOpaqueByX(x, y, width, height, srcPixels);
} else {
return findNonOpaqueByY(x, y, width, height, srcPixels);
}
} /*
* 横向检测左右两侧边界
*/
public int findNonOpaqueByX(int x, int y, int width, int height, int[] srcPixels) {
int mode = OUTSIDE_MODE;
//当前点左右两侧均有边界点出现,则认为当前点在内部或者边框中
if(findNonOpaqueByXLeft(x, y, width, height, srcPixels) && findNonOpaqueByXRight(x, y, width, height, srcPixels)) {
mode = INSIDE_MODE;
}
int pos = y*width+x;
if(isMatch(pos, srcPixels)) {
mode = EDGE_MODE;
}
return mode;
} /*
* 检测与当前点y坐标相同的左侧各点是否有边界存在
*/
public boolean findNonOpaqueByXLeft(int x, int y, int width, int height, int[] srcPixels) {
for(int i=0; i < x; i++) {
int pos = y*width + i;
if(isMatch(pos, srcPixels)) {
return true;
}
}
return false;
} /*
* 检测与当前点y坐标相同的右侧各点是否有边界存在
*/
public boolean findNonOpaqueByXRight(int x, int y, int width, int height, int[] srcPixels) {
for(int i= x+1; i < width; i++) {
int pos = y*width + i;
if(isMatch(pos, srcPixels)) {
return true;
}
}
return false;
} /*
* 纵向检测上下两侧的边界
*/
public int findNonOpaqueByY(int x, int y, int width, int height, int[] srcPixels) {
int mode = OUTSIDE_MODE;
//当前点上下两侧均有边界点出现,则认为当前点在内部或者边框中
if(findNonOpaqueByYTop(x, y, width, height, srcPixels) && findNonOpaqueByYBottom(x, y, width, height, srcPixels)) {
mode = INSIDE_MODE;
}
int pos = y*width+x;
if(isMatch(pos, srcPixels)) {
mode = EDGE_MODE;
}
return mode;
} /*
* 检测与当前点x坐标相同的上方各点是否有边界存在
*/
public boolean findNonOpaqueByYTop(int x, int y, int width, int height, int[] srcPixels) {
for(int i=0; i < y; i++) {
int pos = i*width + x;
if(isMatch(pos, srcPixels)) {
return true;
}
}
return false;
} /*
* 检测与当前点x坐标相同的下方各点是否有边界存在
*/
public boolean findNonOpaqueByYBottom(int x, int y, int width, int height, int[] srcPixels) {
for(int i=y+1; i < height; i++) {
int pos = i*width + x;
if(isMatch(pos, srcPixels)) {
return true;
}
}
return false;
} public boolean isMatch(int pos, int[]srcPixels) {
int color = srcPixels[pos];
int alpha = Color.alpha(color);
//检测是否是边界,针对背景图片选用透明度进行过滤
if(alpha >= 94 && alpha < 255) {
return true;
}
return false;
} /**
* 图片效果叠加
* @param bmp 要裁剪的图片
* @param filter 边框
* @return
*/
public Bitmap overlay(Bitmap bmp, Bitmap filter)
{
int width = bmp.getWidth();
int height = bmp.getHeight();
Bitmap overlay = filter;
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_4444);
bitmap.setHasAlpha(true); // 对边框图片进行缩放
int w = overlay.getWidth();
int h = overlay.getHeight();
float scaleX = width * 1F / w;
float scaleY = height * 1F / h;
Matrix matrix = new Matrix();
matrix.postScale(scaleX, scaleY); Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true); int[] srcPixels = new int[width * height];
int[] layPixels = new int[width * height];
bmp.getPixels(srcPixels, 0, width, 0, 0, width, height);
overlayCopy.getPixels(layPixels, 0, width, 0, 0, width, height); int pos = 0;
for (int i = 0; i < height; i++)
{
for (int k = 0; k < width; k++)
{
pos = i * width + k; int mode = findNonOpaque(k, i, width, height, layPixels);
if(mode == INSIDE_MODE) {
srcPixels[pos] = srcPixels[pos];
continue;
} else if(mode == EDGE_MODE){
srcPixels[pos] = layPixels[pos];
} else{
srcPixels[pos] = 0;
continue;
} }
}
bitmap.setPixels(srcPixels, 0, width, 0, 0, width, height);
return bitmap;
}
} package com.example.test_filter; import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView; public class MainActivity extends Activity { ImageView filter;
AlphaFilter alphaFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
filter = (ImageView) findViewById(R.id.filter);
alphaFilter = new AlphaFilter();
} @Override
protected void onResume() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.album_photo_0);
Bitmap frame = BitmapFactory.decodeResource(getResources(), R.drawable.first_album_frame);
new BitmapFilter().execute(bitmap, frame);
super.onResume();
} class BitmapFilter extends AsyncTask<Bitmap, Bitmap, Bitmap> { @Override
protected Bitmap doInBackground(Bitmap... params) {
Bitmap bitmap = alphaFilter.overlay(params[0], params[1]);
return bitmap;
} @Override
protected void onPostExecute(Bitmap result) {
filter.setImageBitmap(result);
super.onPostExecute(result);
} }
}
android 以不规则图片为边框切割另外图片的更多相关文章
- android项目 之 记事本(12) ----- 图片的等比例缩放及给图片加入边框
本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中常常会遇到图片的缩放,就比方记事本,如今的图片都比較 ...
- Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现
Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...
- Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...
- Android 给图片 加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- android图像处理系列之四-- 给图片添加边框(上)
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- android图像处理系列之五-- 给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- android图像处理系列之四--给图片添加边框(上)
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- android图像处理系列之五--给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- Android 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
随机推荐
- Oracle教程-常用命令(二)
oracle sql*plus常用命令 一.sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1).sys用户是超级用户,具有最高权限,具有sysdba角色,有cr ...
- <转>如何高效快速看懂Android源码
原网址:http://jingyan.baidu.com/article/574c5219ca78ed6c8d9dc12a.html 在Android系统上工作了一段时间,经常会遇到题目中的问题,下面 ...
- hdu_3068_最长回文(Manacher)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:给你一个字符串,让你求最长的回文子串. 题解:数据量比较大,暴力O(n2)会超时,直接上马 ...
- 第10章 接口、继承与多态----Object类
在Java中,所有的类都直接或间接继承了java.lang.Object类.Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类.当创建一个类时,总是在继承,除非某个类已经指定要 ...
- Spring security 获取当前用户
spring security中当前用户信息 1:如果在jsp页面中获取可以使用spring security的标签库 在页面中引入标签 1 <%@ taglib prefix=" ...
- Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题
父窗体部分js代码: var returnValue = window.showModalDialog("son.html ", window); //for chrome if ...
- android studio导入包后无法import
android studio导入jar包的方法: 1.将jar包放到module的libs目录下 2.在所导入的jar包上右键,选择“Add as library”. 其中,第二点跟eclipse不同 ...
- 浅谈 qmake 之 shadow build
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- ignite中的sql查询
ignite中进行sql查询需要对要查询的cache和字段进行配置,可以在xml中配置,也可以在代码中配置或进行注解,我用的是xml配置: <!-- 配置cache --> <pro ...
- jQuery实现父窗口的问题
因为先前遇到的问题,所以我考虑采用 IFRAME 来隔离不同的脚本,从而实现我需要的效果. 在框架中,我用 JavaScript 获取 JSON 数据,组织成 HTML 代码,最后将其填充至上层文档的 ...