文档章节

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

fengsehng
 fengsehng
发布于 2016/11/09 09:15
字数 1209
阅读 1
收藏 0
点赞 0
评论 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

android开发常用工具类、高仿客户端、附近厕所、验证码助手、相机图片处理等源码

Android精选源码 android开发过程经常要用的工具类源码(http://www.apkbus.com/thread-599826-1-1.html) Android类似QQ空间个人主页下拉头部放大的布局效果(http://www.apkbus.com/thread-5...

逆鳞龙 ⋅ 05/29 ⋅ 0

[Android] 随时拍图像处理部分总结及源码分享

随着寒假到来,终于有时间总结下Android这个随手拍的课程作业了,同时分享了我完成的这部分对图像处理的心得吧!你可以结合demo来阅读这篇文章,希望对大家有所帮助. 如果你绝对下面文字太过啰嗦...

Eastmount ⋅ 2015/02/07 ⋅ 0

腾讯X5WebView集成2018-05-15

工作中经常偶尔会用到H5网页来加载页面,使用原生的Android的WebView可以加载,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久...

林灬 ⋅ 05/15 ⋅ 0

佛 山 刻 假 公 章【Q98599-8865】

刻 假 公 章【Q98599-8865】 上 海 刻 假 公 章【Q98599-8865】 深 圳 刻 假 公 章【Q98599-8865】 天 津 刻 假 公 章【Q98599-8865】 广 州 刻 假 公 章【Q98599-8865】 苏 州 刻 假 公 章【...

谢东辉 ⋅ 2013/04/10 ⋅ 0

【百度AR】【Android】demo工程使用手记

【百度AR】【Android】demo工程使用手记 demo工程获取和注意事项 百度AR平台地址:https://ar.baidu.com/testapply 技术文档地址:https://ai.baidu.com/docs#/DuMixAR-Android-SDK/top AR内...

lichong951 ⋅ 05/24 ⋅ 0

android中的深度学习——快速风格迁移

最近学了近一个月半月的深度学习,所以想检验一下学习成果。正好毕设是图像处理APP的实现,所以就把快速风格迁移的前馈神经网络通过Tensorflow for Android移植到了APP上面,作为滤镜快速风格...

codeGoogle ⋅ 05/24 ⋅ 0

关于“发送原图”功能问题的记录

本文主要记录一个bug从发现、定位到延期解决的过程。文末添加了已踩过的坑 近期在做“发送原图”功能的时候,遇到一个bug:在Android、Windows、Mac 客户端发送原图,iOS客户端接收,保存原图...

si1ence ⋅ 2017/12/14 ⋅ 0

盐 城 刻 假 公 章【Q98599-8865】

刻 假 公 章【Q98599-8865】 上 海 刻 假 公 章【Q98599-8865】 深 圳 刻 假 公 章【Q98599-8865】 天 津 刻 假 公 章【Q98599-8865】 广 州 刻 假 公 章【Q98599-8865】 苏 州 刻 假 公 章【...

谢东辉 ⋅ 2013/04/10 ⋅ 0

安卓开发之基于AccessibilityService实现聊天机器人对其他应用的调起

前言 前几天看到一个很有趣的应用视频“小不点”交互机器人,其中有一段是用户给它发一段文字/语音,譬如“我想在美团点一份鸡排”,然后“小不点”自动将美团应用弹出,并进行“鸡排”搜索等...

cxmscb ⋅ 2016/10/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 4分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 9分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 11分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 15分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 20分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 23分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 23分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 26分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 28分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部