ps图片黑白调整算法——Android实现
来源:互联网 发布:淘宝客如意投推广店铺 编辑:程序博客网 时间:2024/05/16 06:29
接续我的上一篇文章:http://blog.csdn.net/mingyueyixi/article/details/78534580
这次是针对安卓上实现Photoshop的黑白调整算法。
其实,实现的方式和java是一致的。只是bitmap比较坑爹一些,如果直接为bitmap对象设置像素,耗时将会大大增加。
具体:
package com.lu.adog.util.image;import android.graphics.Bitmap;/** * @author Yue * @date 2017/11/17 17:42 */public class PSGray { /** * Photoshop 黑白算法,默认效果 * * @param image * @return 新的黑白化图片 */ public static Bitmap createBlackWhiteImage(Bitmap image) { return createBlackWhiteImage(image, null); } /** * Photoshop 黑白算法,默认效果 * * @param image * @return 新的黑白化图片 * @radios 颜色通道配置,依次为红、黄、 绿、 青、 蓝、紫六个通道 */ public static Bitmap createBlackWhiteImage(Bitmap image, float[] radios) { int width = image.getWidth(); //获取位图的宽 int height = image.getHeight(); //获取位图的高 Bitmap result = Bitmap.createBitmap(width, height, image.getConfig()); int alpha = 0xff; int r = 0; int g = 0; int b = 0; int max = 0; int min = 0; int mid = 0; int gray = 0; float radioMax = 0; float radioMaxMid = 0; if (radios == null) { // 红 黄 绿 青 蓝 紫 radios = new float[]{0.4f, 0.6f, 0.4f, 0.6f, 0.2f, 0.8f}; } int[] resultPixle = new int[width*height]; for (int i = 0; i < width; i++) {//一列列扫描 for (int j = 0; j < height; j++) { gray = image.getPixel(i, j); alpha = gray >>> 24; r = (gray >> 16) & 0x000000ff; g = (gray >> 8) & 0x000000ff; b = gray & 0x000000ff; if (r >= g && r >= b) { max = r; radioMax = radios[0]; } if (g >= r && g >= b) { max = g; radioMax = radios[2]; } if (b >= r && b >= g) { max = b; radioMax = radios[4]; } if (r <= g && r <= b) { // g+ b = cyan 青色 min = r; radioMaxMid = radios[3]; } if (b <= r && b <= g) {//r+g = yellow 黄色 min = b; radioMaxMid = radios[1]; } if (g <= r && g <= b) {//r+b = m 洋红 min = g; radioMaxMid = radios[5]; } mid = r + g + b - max - min;// 公式:gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min gray = (int) ((max - mid) * radioMax + (mid - min) * radioMaxMid + min); gray = (alpha << 24) | (gray << 16) | (gray << 8) | gray;// 2000x3500大图,耗时相差2~5倍左右//bitmap在循环中设置像素点,这个操作会导致耗时严重,耗时7秒。4096x4096图耗时22秒// result.setPixel(i, j, gray); resultPixle[j*width+i] = gray;//直接改变数组,最后bitmap再设像素 } } result.setPixels(resultPixle,0,width,0,0,width,height);//最后bitmap再设像素 return result; }}
如果在循环体中,使用bitmap.setPixel(i, j, gray); 直接改变某一点的像素,那么n次循环下来,会导致效率大大降低,耗时相差2~5倍左右。本来在安卓中使用java来处理图片就很慢了。。。
使用上叙的方法,4096x4096图在无压缩的情况下,完全处理完毕,需要耗时22秒。测试用的是360手机。其中,三星手机也进行过测试,但由于内存限制,进行了缩放加载,缩放后图片有2000*2000以上,之后再处理,耗时同样严重,10秒以上。
所以,图片处理这种事,java上的处理是不给力的,尤其是在移动端这种东东身上。除非是进行类似模糊这种,可以进行缩小之后处理,最后放大,而不影响最终效果的运算。
阅读全文
0 0
- ps图片黑白调整算法——Android实现
- ps图片黑白调整算法——java实现及性能优化
- PS 图像调整算法——黑白
- matlab实现PS算法之黑白照
- Python: PS 图像调整--黑白
- PS 图像调整算法——阈值
- 蒙版和调整图层的使用—用PS调出黑白背景
- OpenCV——黑白调整
- PS 图像调整算法——亮度调整
- PS 图像调整算法——饱和度调整
- matlab实现PS算法之亮度调整
- PS 图像黑白调整算法(彩色图转灰度图)(VC++)
- PS 图像调整算法——色调分离
- PS 图像调整算法——反相
- PS 图像调整算法— —渐变映射
- Android 各种图片转黑白图和抖动算法的黑白图
- 利用PS实现局部黑白特效
- PS 图像调整算法——自动色阶 (Auto Levels)
- 1058. 选择题(20)
- python colormap(颜色映射)
- Javase—分支语句
- 习题6.18
- eclipse 创建maven 项目 动态web工程完整示例
- ps图片黑白调整算法——Android实现
- 1059. C语言竞赛(20)
- MySQL连接错误实例
- 判断IP地址(精辟)
- 字符串函数
- JavaScript中的作用域
- BZOJ2330(SCOI2011)[糖果]--差分约束系统
- pychart的使用
- android rxjava框架 1.0 操作符介绍