转自: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 以不规则图片为边框切割另外图片的更多相关文章

  1. android项目 之 记事本(12) ----- 图片的等比例缩放及给图片加入边框

    本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中常常会遇到图片的缩放,就比方记事本,如今的图片都比較 ...

  2. Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现

     Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...

  3. Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框

     Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...

  4. Android 给图片 加边框

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  5. android图像处理系列之四-- 给图片添加边框(上)

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  6. android图像处理系列之五-- 给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  7. android图像处理系列之四--给图片添加边框(上)

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  8. android图像处理系列之五--给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  9. Android 给图片加边框

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

随机推荐

  1. Python使用ctypes访问C代码

    工具:CodeBlocks 新建一个分享库工程( Shared library ),随便编写一个C代码的函数 // test.c #include <stdio.h> int fib(in ...

  2. 转:JDBC驱动配置相关

    1.做JDBC请求 ,首先要了解这个JDBC对象是什么,现在以SQLServer为例来说明 首先下载对应的数据库驱动(百度“jdbc sqlserver驱动”,然后下载). 注意 :下载完成后,直接把 ...

  3. web开发——水到渠成

    1.tomcat中设置编码格式:      打开server.xml,添加下面红色框框里面的内容.  

  4. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

  5. JavaScript 错误 - Throw、Try 和 Catch

    http://www.w3school.com.cn/js/js_errors.asp try 语句测试代码块的错误.catch 语句处理错误.throw 语句创建自定义错误. 错误一定会发生 当 J ...

  6. Django:之中间件、微信接口和单元测试

    Django中间件 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通过中间件中的 pr ...

  7. ECOS-认证地址

    ECOS系统授权认证,需要和Shopex认证中心互联.当服务器DNS无效时.需要绑定host强行解析服务器强行解析以下vim /etc/hosts 122.144.135.142 service.sh ...

  8. linux脚本定期执行

    vi /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .----------- ...

  9. jquery新窗口打开链接

    第一种:下面的代码是针对m35ui这个样式下的a都是在新窗口打开    <script type="text/javascript">  jQuery(document ...

  10. go mode

    https://github.com/dominikh/go-mode.el http://blog.altoros.com/golang-part-1-main-concepts-and-proje ...