介绍我参与开发的妙趣剪纸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面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧,都是干货!

微信订阅号二维码如下:

【57】android图片印刻,阳刻,素描图效果处理的更多相关文章

  1. android 图片特效处理之 光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  2. android 图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  3. android 图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  4. android图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  5. android图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  6. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  7. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现

    Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...

  8. android项目实战 --ListView 头部ViewPager广告轮询图效果

    看开源框架:https://github.com/tianshaojie/AndroidFine,里面有如下效果,特记录学习下,以后项目中用也好能够立刻想起来.   如上面所示,是常见项目中的图片轮训 ...

  9. Android项目实战(四十七):轮播图效果Viewpager

    简易.常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V    需求如下: 不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最 ...

随机推荐

  1. ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation

    ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  2. Appium移动自动化测试(五)--app控件获取之uiautomatorviewer

    初探 在Android的SDk提供了以下的工具来支持我们进行UI自动化测试: uiautomatorviewer:用来扫描和分析Android应用程序的UI控件的工具. uiautomator:一个包 ...

  3. JBOSS EAP 6 系列六 公共模块的jar配置到jboss的modules详细配置

    公司项目中遇到并要解决的问题 1:原则上除了自己写的代码之外,公共的jar不应该都在打包的时候打包到ear里面,这样的话包太大,也不符合的分层的逻辑,在jboss容器内部,每个ear的包重复jar都会 ...

  4. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

  5. springMVC源码分析--HandlerInterceptor拦截器调用过程(二)

    在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...

  6. Java之继承深刻理解

    1.关于私有成员变量 无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protecte ...

  7. Spring整合DWR comet 实现无刷新 多人聊天室

    用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...

  8. 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文

    . 一. 编译错误 1. "AndroidManifest.xml file not found" 错误 (1) 报错信息 报错信息 : -- Message Make : Inf ...

  9. [django]用日期来查询datetime类型字段

    有一个model的字段是 DateTimeField,我现在要具体查询某一天date的数据,应该怎么用orm来查询呢? 指定年月日 YourModel.objects.filter(datetime_ ...

  10. shell入门之函数应用

    最近在学习shell编程,文中若有错误的地方还望各位批评指正. 先来看一个简单的求和函数 #!/bin/bash #a test about function f_sum 7 8 function f ...