【57】android图片印刻,阳刻,素描图效果处理
介绍我参与开发的妙趣剪纸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图片印刻,阳刻,素描图效果处理的更多相关文章
- android 图片特效处理之 光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- android 图片特效处理之光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- android 图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- android图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- android图片特效处理之光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...
- android项目实战 --ListView 头部ViewPager广告轮询图效果
看开源框架:https://github.com/tianshaojie/AndroidFine,里面有如下效果,特记录学习下,以后项目中用也好能够立刻想起来. 如上面所示,是常见项目中的图片轮训 ...
- Android项目实战(四十七):轮播图效果Viewpager
简易.常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 需求如下: 不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最 ...
随机推荐
- 一个貌似比较吊的递归转换为loop--总算成功了.--第二弹
前段时间用类似于散弹式编程的方式,各种猜测-运行验证-修正结果,最终成功转换了一个看起来比较有难度的递归函数.但总觉得很蛋疼,原因如下: 1.虽然正确,但是逻辑搞得比较复杂.现在去看,一头雾水,不知道 ...
- Java学习之继承中的执行顺序详解
代码块(理解) (1)用{}括起来的代码. (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率. B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前 ...
- 前端面试题-----js和jquery的区别是什么?
最近我有一个朋友问我js和jquery的区别是什么,于是我打算写一篇文章说下到底有什么区别. 首先你要知道: 1.js是网页的脚本语言,记住哈,js是语言! 2.jquery是用js语言写出来的一个框 ...
- JSP自定义方法库
如果JSTL的方法库没有满足需要,可以使用自定义方法进行扩展 public class Function{ public static int length(Object obj){ //返回对象的长 ...
- 从嵌入式linux到android应用开发
时间过得很快,转眼之间已经到新公司一个月了.虽然学到了一些移动开发的知识,但是觉得离我的目标还很远,完全没能达到我想要的水平.以前产品都是自己主导的,需要完成什么,计划什么也是自己主导,现在得从头 ...
- Android初级教程:对文件和字符串进行MD5加密工具类
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52200008 点击打开链接 之前写过一篇博文,是针对字符串进行md5加密的.今 ...
- GCD API记录(二)
前言 这是关于GCD的第二篇文章,GCD的API有100多个,通过快捷键Option + 单击,可以在Reference中的Grand Central Dispatch (GCD) Reference ...
- Linux2.6 --系统调用处理程序
用户空间的程序无法直接执行内核代码.它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上.如果进程可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在. ...
- android开发之broadcast学习笔记
android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...
- Simple tutorial for using TensorFlow to compute polynomial regression
"""Simple tutorial for using TensorFlow to compute polynomial regression. Parag K. Mi ...