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 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
随机推荐
- cPanel 安装方法
. 如何安装cPanel/WHM? 答:安装过程较长,建议使用screen或nohupscreen: yum -y install screen perl screen -S cpanel cd /h ...
- C#未将对象引用设置到对象的实例
未将对象引用设置到对象的实例,这个错误的意思是对象为null,但你还要去取里面的值,所以计算机就不干了.解决办法一般是:用一个你不能确定是不是为null的对象时,尽量做个判断.if(object!=n ...
- hdu_2224_The shortest path(dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2224 题意:双调欧几里德旅行商经典问题,找一条最短回路使得该路经过所有的点 题解:dp[i][j]=d ...
- IoC容器Autofac正篇之类型注册(五)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- jquery checkbox 操作
1.jquery 获取所有选中和未选中的checkbox 未选中 var unCheckedBoxs = $("input[name='myCheckbox']").not(&qu ...
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...
- Inno Setup入门(十九)——Inno Setup类参考(5)
: Install Setup 2013-02-02 11:29 377人阅读 评论(0) 收藏 举报 单选按钮 单选按钮在安装中也很常见,例如同一个程序可以选择安装不同的性质的功能,例如选择32位或 ...
- PhotoShop纸张大小
1*标准打印纸 A4:210mm*297mm A3: 420mm*297mm 一张全开纸切成多少份 大度16开:210mm*285mm(度:切的意思) 大度8开:420*285mm 2*传统印刷纸 A ...
- Java学习笔记之一
1.对大小写敏感 2.class,类是构建所有Java应用程序和applet的构建块,Java应用程序中的全部内容都必须放置在类中. 3.类名,没有长度限制,必须以字母开头,可以使字母.数字.下划线的 ...
- 8.5 sikuli 集成进eclipse 报错:can't be found on the disk
运行提示can't be found on the disk