文档章节

【57】android图片印刻,阳刻,素描图效果处理

fengsehng
 fengsehng
发布于 2016/11/09 09:15
字数 1209
阅读 4
收藏 0

介绍我参与开发的妙趣剪纸app使用的图片处理相关的技术

关于妙趣剪纸,各大android商店都可以下载,下面贴出小米商店的链接

妙趣剪纸下载

软件效果截图

这里写图片描述
这里写图片描述

如何实现上面的图片处理效果呢

1.初始化高斯矩阵

ProcessFactory.IniGauss_2(ProcessFactory.gauss_radius); //初始化高斯矩阵

2.转化为灰度图

Bitmap bmpGrayscale=ProcessFactory.toGray2(activity.imageBmp); //转化为灰度图

3.反色

Bitmap bmpGauss=ProcessFactory.toInverse(bmpGrayscale); //反色

4.高斯模糊

bmpGauss=ProcessFactory.toGauss(bmpGauss); //高斯模糊

5.处理颜色减淡生成素描图

toColorDodge()函数

/** * 处理颜色减淡 * @param bmpGauss 高斯模糊完毕的图像 * @param bmpGrayscale 灰度图像 * @return */
     // 在原先的灰度图上做颜色减淡,使用反色高斯图辅助```
 bmpPapercut=ProcessFactory.toColorDodge(bmpGauss,bmpGrayscale); // TODO bmpColorDodge 图即为素描图

6.papercut处理

bmpPapercut=ProcessFactory.toPapercut(bmpPapercut);

7.膨胀处理

bmpPapercut = ProcessFactory.toPengzhang(bmpPapercut);for(int i = 0; i < 2; i++)
        { bmpPapercut = ProcessFactory.toPengzhang(bmpPapercut); }

8.腐蚀处理

for(int i = 0; i < 2; i++)
        { bmpPapercut = ProcessFactory.toFushi(bmpPapercut); }

9.frame处理

Bitmap min_img = ProcessFactory.toFramed(bmpPapercut);

最终阳刻算法结束

下面介绍印刻的处理算法

1.初始化高斯矩阵

ProcessFactory.IniGauss_2(ProcessFactory.gauss_radius); //初始化高斯矩阵

2.转化为灰度图

Bitmap bmpGrayscale=ProcessFactory.toGray2(activity.imageBmp); //转化为灰度图

3.反色

Bitmap bmpGauss=ProcessFactory.toInverse(bmpGrayscale); //反色

4.高斯模糊

bmpGauss=ProcessFactory.toGauss(bmpGauss); //高斯模糊

5.处理颜色减淡生成素描图

toColorDodge()函数

/** * 处理颜色减淡 * @param bmpGauss 高斯模糊完毕的图像 * @param bmpGrayscale 灰度图像 * @return */
     // 在原先的灰度图上做颜色减淡,使用反色高斯图辅助```
 bmpPapercut=ProcessFactory.toColorDodge(bmpGauss,bmpGrayscale); // TODO bmpColorDodge 图即为素描图

6.印刻处理

bmpPapercut=ProcessFactory.toYinkePapercut(bmpPapercut);

7.腐蚀处理

for(int i = 0; i < 2; i++)
            bmpPapercut = ProcessFactory.toFushi(bmpPapercut);

印刻结束,可以看出来,印刻和阳刻的前五步基本一样

工具类是ProcessFactory,上面用到的所有函数的定义都在里面可以找到

部分关键代码贴出,如果进一步交流,请加我下面的微信

/** * 初始化高斯矩阵 * @param fi */
    public static void IniGauss_2(int fi)
    {
        toOne = 0;           //一定要对此变量进行初始化操作!
        GAUSS = new double[(fi*2+1)*(fi*2+1)];
        int index = 0;

        for (int x=-fi; x<=fi; x++){
            for (int y=-fi; y<=fi; y++){
                double sqrtFi = sigma*sigma;
                double ex = Math.pow(Math.E, (-(double)(x*x + y*y)/(2*(double)sqrtFi)));
                double result = ex/(double)(2 * Math.PI * sqrtFi);
                GAUSS[index] = result;
                toOne += result;
                index++;
                //MessageBox.Show(result.ToString());
                }
            }
        for (int i = 0; i < index; i++){
            GAUSS[i] = GAUSS[i] / toOne;
            //System.out.println("GAUSS["+i+"] = " + GAUSS[i]);
        }

        double sum = 0;
        for( double i : GAUSS) {
            sum += i;
        }
        //System.out.println("sum is"+sum);

    }

    /** * 取灰度图像函数1 * @param bmpOriginal * @return */
    public static Bitmap toGray1(Bitmap bmpOriginal){ 
        int width = bmpOriginal.getWidth(); //获取位图的宽 
        int height = bmpOriginal.getHeight(); //获取位图的高 

        int[] pixels = new int[width*height]; //通过位图的大小创建像素点数组 

        bmpOriginal.getPixels(pixels, 0, width, 0, 0, width, height); 
        int alpha = (pixels[0] & 0xFF000000)>>24; 
        //int alpha = (byte)0xFF; 
        for(int i = 0; i < height; i++){ 
            for(int j = 0; j < width; j++){ 
                int pixel_src = pixels[width * i + j]; 
                int red = (pixel_src & 0x00FF0000 ) >> 16; 
                int green = (pixel_src & 0x0000FF00) >> 8; 
                int blue = pixel_src & 0x000000FF; 
                //注意需要先转换成float类型
                int pixel_gray = (int)(((float)red) * 0.299 + ((float)green) * 0.587 + ((float)blue) * 0.114);
                int pixel_output = ((alpha <<24) & 0xFF000000) | ((pixel_gray << 16) & 0x00FF0000) | 
                        ((pixel_gray << 8) & 0x0000FF00) | (pixel_gray & 0x000000FF); 
                pixels[width * i + j] = pixel_output; 
                } 
            } 
        Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
        bmpGrayscale.setPixels(pixels, 0, width, 0, 0, width, height); 
        return bmpGrayscale; 

        //bmpOriginal.setPixels(pixels, 0, width, 0, 0, width, height); 
        //return bmpOriginal; 
    }

// public static Bitmap toGray5(Bitmap bmpOriginal){
// int row;
// int pixel;
// int R, G, B, A = 255;
// 
// int width = bmpOriginal.getWidth(); //获取位图的宽 
// int height = bmpOriginal.getHeight(); //获取位图的高 
// int[] pixels = new int[width*height]; //通过位图的大小创建像素点数组 
// bmpOriginal.getPixels(pixels, 0, width, 0, 0, width, height); 
// 
// for(int i = 0; i < height; i++)
// { 
// row = width * i;
// for(int j = 0; j < width; j++)
// { 
// int pixel_src = pixels[row + j]; 
// 
// R = (pixel_src & 0x00FF0000 ) >> 16; 
// G = (pixel_src & 0x0000FF00) >> 8; 
// B = pixel_src & 0x000000FF; 
// 
// pixel = (int)(R * 0.299 + G * 0.587 + B * 0.114);
// R = G = B = pixel;
// 
// pixel = (A << 24) | (R << 16) | (G << 8) | B; 
// pixels[row + j] = pixel; 
// } 
// } 
// Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
// bmpGrayscale.setPixels(pixels, 0, width, 0, 0, width, height); 
// return bmpGrayscale; 
// }

    /** * 取灰度图像函数2 * @param bmpOriginal * @return */
     public static Bitmap toGray2(Bitmap bmpOriginal) {
        int width, height;
        height = bmpOriginal.getHeight();
        width = bmpOriginal.getWidth();    

        Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmpGrayscale);
        Paint paint = new Paint();
        ColorMatrix cm = new ColorMatrix();
        cm.setSaturation(0);
        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        paint.setColorFilter(f);
        c.drawBitmap(bmpOriginal, 0, 0, paint);
        return bmpGrayscale;
        }

     /** * 取反色 * @param bmpOriginal * @return */
     public static Bitmap toInverse(Bitmap bmpOriginal){
        int width = bmpOriginal.getWidth(); //获取位图的宽 
        int height = bmpOriginal.getHeight(); //获取位图的高 

        int[] pixels = new int[width*height]; //通过位图的大小创建像素点数组 

        bmpOriginal.getPixels(pixels, 0, width, 0, 0, width, height); 
        int alpha = (byte)((pixels[0] & 0xFF000000)>>24); 
        for(int i = 0; i < height; i++){ 
            for(int j = 0; j < width; j++){ 
                int pixel_src = pixels[width * i + j]; 
                int red = ((pixel_src & 0x00FF0000 ) >> 16); 
                int green = ((pixel_src & 0x0000FF00) >> 8); 
                int blue = (pixel_src & 0x000000FF); 

                red = 255 - red;
                green = 255 - green;
                blue = 255 - blue;

                pixel_src = (alpha<<24) | (red << 16) | (green << 8) | blue; 
                pixels[width * i + j] = pixel_src; 
                } 
            } 
        Bitmap bmpInverse = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
        bmpInverse.setPixels(pixels, 0, width, 0, 0, width, height); 
        return bmpInverse; 

// bmpOriginal.setPixels(pixels, 0, width, 0, 0, width, height); 
// return bmpOriginal; 
        }

我的微信二维码如下,欢迎交流讨论

这里写图片描述

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧,都是干货!

微信订阅号二维码如下:

这里写图片描述

© 著作权归作者所有

共有 人打赏支持
fengsehng
粉丝 4
博文 284
码字总数 214494
作品 0
朝阳
程序员
私信 提问
RenderScript高斯模糊等与图片处理/计算机视觉-Android

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

shareus
05/03
0
0
安卓开发实现背景图片应用于各种尺寸的屏幕且不失真

【原创】安卓开发中,无论是背景图还是按钮图或者其他图,都不希望随着移动设备的改变而失真,如果想要实现背景图片应用于各种尺寸的屏幕且不失真,需要先对图片进行一下处理。 在这里,我使...

bluecoffee
2014/07/04
0
2
[Android学习笔记九] Android 开发中图片灰阶(黑白)显示

阅读本文之前关于将RGB颜色值转换为灰阶值的计算方法可参见: 三种算法转换彩色灰阶 http://aiilive.blog.51cto.com/1925756/1718960 灰阶显示图片的典型应用就是用户头像,如用户在线头像显...

secondriver
06/26
0
0
Android开发 API人脸检测实例教程(内含源码)

Android中文API最新中文版 http://www.eoeandroid.com/thread-58597-1-1.html =============帖子正文======================= 通过两个主要的API,Android提供了一个直接在位图上进行脸部检测...

76135
2012/07/17
0
1
android自定义button样式

在Android开发应用中,默认的Button是由系统渲染和管理大小的。而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的。因此,我们在开发产品的时候,需要对默认按钮进行美化。在本篇...

sumpower
2014/02/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

方之熙博士被任命为RISC-V基金会中国顾问委员会主席,加速RISC-V ISA在中国的应用

中国顾问委员会将就RISC-V基金会的教育和应用推广战略提供指导 今天在中国乌镇举行的世界互联网大会(World Internet Conference)上,RISC-V基金会(RISC-V Foundation)宣布,半导体行业资深人...

whoisliang
32分钟前
1
0
为了用户体验,不要做浏览器兼容

读者看到这篇文章的标题也许会感到奇怪,按照通常的经验来说,为了用户体验应该做浏览器兼容,以便让不同的浏览器用户都能有好的体验,从而增加网站的流量,但是我认为做浏览器兼容属于同样的...

Bob2100
32分钟前
1
0
分布式定时任务架构 (二) xxl-job二次开发实践

4个月前,公司有任务调度的需求,需要一周内完成,时间非常紧。 需求有三点: web界面编辑cron表达式,启动,停止任务 接入公司的rpc成本较低,公司有自研的rpc,研发人员希望共用同一套注解 ...

勇哥和你一起学技术
49分钟前
1
0
React和Redux的连接react-redux

通过Redux文档来了解react-redux,在一段时间的实践后准备翻一翻源代码,顺便做些相关的总结。我看的代码的npm版本为v4.0.0,也就是说使用的React版本是0.14.x。 react-redux提供两个关键模块...

前端攻城老湿
今天
1
0
1、Mybatis连接池配置 和 Context.xml的配置

注意: (1)mybatis 3.2 之前 通过 set get 方法 获取相关属性。之后通过属性姓名获取相关关联。 (2)mybatis 映射 优先为 sql 语句中的别名与实体类的属性进行映射。 (3)jndi Java用于调...

KingFightingAn
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部