文档章节

java实现Android高斯模糊思路

march_kk
 march_kk
发布于 2017/05/03 17:47
字数 777
阅读 17
收藏 0
public class GaussFilterTask extends AsyncTask<Void, Double, Void> {

    private Bitmap bitmap;
    private Bitmap target;
    private Context context;
    private View imageTarget;

    public GaussFilterTask(Context context, ImageView imageTarget) {
        super();
        this.context = context;
        Drawable drawable = imageTarget.getDrawable();
        this.imageTarget = imageTarget;
        bitmap = ((BitmapDrawable) drawable).getBitmap();
        bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() / 20, bitmap.getHeight() / 20, false);
    }


    public GaussFilterTask(Context context, View imageTarget, Bitmap bitmap) {
        super();
        this.context = context;
        this.imageTarget = imageTarget;
        this.bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() / 20, bitmap.getHeight() / 20, false);
    }

    @Override
    protected Void doInBackground(Void... params) {
        gaussBlur(bitmap, target);//调用高斯模糊方法
        return null;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        target = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    }


    @Override
    protected void onProgressUpdate(Double... values) {
        super.onProgressUpdate(values);
    }

    @TargetApi(Build.VERSION_CODES.DONUT)
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        if (imageTarget instanceof ImageView) {
            ((ImageView) imageTarget).setImageDrawable(new BitmapDrawable(context.getResources(), target));
        } else {
            imageTarget.setBackgroundDrawable(new BitmapDrawable(context.getResources(), target));
        }

    }


    private void gaussBlur(Bitmap src, Bitmap target) {
        if (src.getConfig() != Bitmap.Config.ARGB_8888) {//简化考虑,只支持ARGB8888格式的Bitmap,即 透明、红、绿、蓝四个通道各占一个字节
            return;
        }

        int boxWidth = 7;//盒子大小为7x7
        int boxHeight = 7;
        GaussFilter filter = new GaussFilter(boxHeight, boxWidth);//实例化GaussFilter,并传递给filter()方法

        for (int i = 0; i < src.getHeight(); i++) {
            for (int j = 0; j < src.getWidth(); j++) {
                int meanPixel = filter(boxWidth, boxHeight, i, j, src, filter);

                target.setPixel(j, i, meanPixel);

            }

        }

    }


    /**
     * 根据滤波模板进行滤波
     *
     * @param boxWidth  盒子宽度(此处为3)
     * @param boxHeight 盒子高度(此处为3)
     * @param rowIndex  targetBitmap的目标像素点在第xx行
     * @param colIndex  targetBitmap的目标像素点在第xx列
     * @param src       源Bitmap
     * @param filter    滤波模板
     * @return
     */
    private int filter(int boxWidth, int boxHeight, int rowIndex, int colIndex, Bitmap src, Filter filter) {
        if (boxWidth % 2 == 0 || boxHeight % 2 == 0)
            return 0;

        int targetPixel = 0xff000000;//计算的结果
        int redSum = 0;
        int greenSum = 0;
        int blueSum = 0;
        int temp;

        for (int i = rowIndex - boxHeight / 2, boxRow = 0; i <= rowIndex + boxHeight / 2; i++, boxRow++) {
            for (int j = colIndex - boxWidth / 2, boxCol = 0; j <= colIndex + boxWidth / 2; j++, boxCol++) {
                if (i < 0 || i >= src.getHeight() || j < 0 || j >= src.getWidth()) //越界
                    temp = src.getPixel(colIndex, rowIndex);
                else
                    temp = src.getPixel(j, i);//依次取出盒子内的像素点
                redSum += ((temp & 0x00ff0000) >> 16) * filter.weight(boxRow, boxCol);//求均值,先计算sum,对于 均值模糊, 这里的weight为1
                greenSum += ((temp & 0x0000ff00) >> 8) * filter.weight(boxRow, boxCol);//求均值,先计算sum,对于 均值模糊, 这里的weight为1
                blueSum += (temp & 0x000000ff) * filter.weight(boxRow, boxCol);//求均值,先计算sum,对于 均值模糊, 这里的weight为1
            }
        }

        int meanRed = ((int) (redSum * 1.0 / filter.total())) << 16;//ARGB red通道需要左移16bit归位,对于 均值模糊, 这里的total为9
        int meanGreen = ((int) (greenSum * 1.0 / filter.total())) << 8;//ARGB green通道需要左移8bit归位,对于 均值模糊, 这里的total为9
        int meanBlue = ((int) (blueSum * 1.0 / filter.total()));//,对于 均值模糊, 这里的total为9
        targetPixel = (targetPixel | meanRed | meanGreen | meanBlue);//或运算 将3个求均值的结果合一
        return targetPixel;
    }


    /**
     * Created by zjl on 2016/12/13.
     * 使用二项式分布逼近的高斯滤波器
     */
    private class GaussFilter implements Filter {

        private int width;
        private int height;

        public GaussFilter(int boxHeight, int boxWidth) {
            this.height = boxHeight;
            this.width = boxWidth;

        }

        @Override
        public int weight(int rowIndex, int colIndex) {
            int me = C(width - 1, colIndex);
            return me * C(height - 1, rowIndex);
        }

        @Override
        public int total() {
            int result = (int) Math.pow(2, width + height - 2);
            return result;
        }

        private int C(int n, int k) { //n次二项展开式,第k项
            if (k <= 0)
                return 1;
            if (k > n / 2)
                return C(n, n - k);

            int result = 1;
            for (int i = 1; i <= k; i++)
                result *= (n - i + 1);
            for (int i = 1; i <= k; i++)
                result /= i;

            return result;
        }


    }


    public interface Filter {
        int weight(int rowIndex, int colIndex);//盒子元素与滤波模板元素做乘积最后求平均,在均值模糊中,这里的weight为1

        int total();//前面求出sum然后除以total求出最后的平均颜色值
    }

}

 

© 著作权归作者所有

共有 人打赏支持
march_kk
粉丝 0
博文 18
码字总数 2847
作品 0
西安
程序员
私信 提问
[Android] 图片JNI(C++\Java)高斯模糊 多线程

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.......

Qiujuer
2014/12/06
0
8
RenderScript高斯模糊等与图片处理/计算机视觉-Android

> RenderScript Google 官方RenderScript- https://developer.android.com/guide/topics/renderscript/compute RenderScript在3.0引入,而一些内置的compute kernel在JELLYBEANMR1中引入,为......

shareus
05/03
0
0
android Animation图片渐变动画 Demo

最终实现效果: 项目目录结构: main.xml Java代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout......

lwaif
2015/06/24
0
0
简单的安卓应用授权认证(JNI)

最近一直在做公司的一个安卓开发框架,含so库,接近尾声了,领导提出一个需求,要求使用这个框架的开发者必须有我们的授权才可以,但是对方发布的应用后又不能被此授权限制——要不然所有的应...

tnjin
2014/11/09
0
2
Android Camera 模块分析(三)

第三部分 Camera的主要实现分析   3。1 JAVA程序部分   在packages/apps/Camera/src/com/android/camera/ 目录的Camera。java文件中,包含了对Camera的调用   在Camera。java中包含对包...

Jerikc
2012/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hive的三种Join方式

Hive中就是把Map,Reduce的Join拿过来,通过SQL来表示。 参考链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins Common/Shuffle/Reduce Join Reduce Join在Hiv......

GordonNemo
20分钟前
1
0
Spark学习记录(三)核心API模块介绍

spark ------------- 基于hadoop的mr,扩展MR模型高效使用MR模型,内存型集群计算,提高app处理速度。 spark特点 ------------- 速度:在内存中存储中间结果。 支持多种语言。Scala、Java、P...

我爱春天的毛毛雨
25分钟前
1
0
PHP5、PHP7安装

11月13日任务 11.10/11.11/11.12 安装PHP5 11.13 安装PHP7 PHP官网www.php.net 当前主流版本为5.6/7.1 cd /usr/local/src/ wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2 tar z......

zgxlinux
26分钟前
1
0
React 项目结构和组件命名之道

摘要: > * 原文地址:[structuring projects and naming components in react](https://hackernoon.com/structuring-projects-and-naming-components-in-react-1261b6e18d76) > * 原文作者:......

阿里云官方博客
26分钟前
3
0
无维护地稳定运行了8 年的 Hyperic HQ

最近在诊断一个系统意外停机时, 发现一个8年前部署部署的Hypeirc HQ 4.2,已经免维护,稳定运行了8年多。提供了及时的诊断信息。单击右下角的蓝色泡泡,可显示报警信息。

MartinKing
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部