Android 使用ColorMatrix改变图片颜色
ColorMatrix的颜色矩阵介绍
- 颜色矩阵M是一个5*4的矩阵,在Android中,颜色矩阵M是以一维数组
m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]
的方式进行存储的。如下图1:
图1 颜色矩阵M
他通过RGBA四个通道来直接操作对应颜色,达到修改图像的效果。
- 第一行决定红色 R
- 第二行决定绿色 G
- 第三行决定蓝色 B
- 第四行决定了透明度 A
- 第五列是颜色的偏移量
原图的RGBA的ColorMatrix颜色矩阵数组为:
[ 1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0]
在一张图片中,图像的RGBA(红色、绿色、蓝色、透明度)值决定了该图片所呈现出来的颜色效果。而图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,由颜色分量矩阵C可以控制图像的颜色效果。颜色分量矩阵C 如图2所示:
图2 颜色分量矩阵C要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可。通过颜色矩阵可以很方便的修改图像的颜色分量矩阵。假设修改后的图像颜色分量矩阵为C1,则有如图3所示的颜色分量矩阵计算公式:
图3 颜色分量矩阵计算公式
通常,改变颜色分量时可以通过修改第5列的颜色偏移量来实现,如图4所示的颜色矩阵M1,通过计算后可以得知该颜色矩阵的作用是使图像的红色分量和绿色分量均增加100,这样的效果就是图片泛黄(因为红色与绿色混合后得到黄色)。
图4 颜色矩阵M1
除此之外,也可以通过直接对颜色值乘以某一系数而达到改变颜色分量的目的。如图5所示的颜色矩阵M2,将绿色分量放大了2倍,这样的效果就是图片泛绿色。
图5 颜色矩阵M2
————以上内容收集于网络:http://www.android100.org/html/201406/05/19490.html———-
使用ColorMatrix改变图片颜色的步骤
- 通过Bitmap.createBitmap()方法获得一个空白的Bitmap对象。
- 使用Bitmap对象创建画布Canvas, 然后创建画笔Paint。
- 定义ColorMatrix,并指定RGBA矩阵。
- 使用ColorMatrix创建一个ColorMatrixColorFilter对象, 作为画笔的滤镜 paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix))。
- 使用Canvas.drawBitmap()方法把原图使用定义的Paint画到空白的Bitmap对象上即可获得改变RGBA值后的图像。
图像颜色处理实例
首先准备一张用来修改颜色的黑色原始图片 btn_pause.png 如下:
布局文件 colormatrix_activity.xml 内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="R" /><SeekBar
android:id="@+id/sb_red"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="255"android:progress="0" /><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="G" /><SeekBar
android:id="@+id/sb_green"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="255"android:progress="0" /><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="B" /><SeekBar
android:id="@+id/sb_blue"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="255"android:progress="0" /><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="A" /><SeekBar
android:id="@+id/sb_alpha"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="255"android:progress="255" /><ImageView
android:id="@+id/iv_color_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:layout_gravity="center_horizontal"android:src="@drawable/btn_pause" /></LinearLayout>
- 界面代码 ColorMatrixActivity.java
/*** Created by lvzhengbin on 15/10/15.*/
public class ColorMatrixActivity extends ActionBarActivity {private SeekBar sb_red, sb_green, sb_blue, sb_alpha;private ImageView iv_show;private Bitmap afterBitmap;private Paint paint;private Canvas canvas;private Bitmap baseBitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.colormatrix_activity);initView();}private void initView() {iv_show = (ImageView) findViewById(R.id.iv_color_show);sb_red = (SeekBar) findViewById(R.id.sb_red);sb_green = (SeekBar) findViewById(R.id.sb_green);sb_blue = (SeekBar) findViewById(R.id.sb_blue);sb_alpha = (SeekBar) findViewById(R.id.sb_alpha);sb_red.setOnSeekBarChangeListener(seekBarChange);sb_green.setOnSeekBarChangeListener(seekBarChange);sb_blue.setOnSeekBarChangeListener(seekBarChange);sb_alpha.setOnSeekBarChangeListener(seekBarChange);baseBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.btn_pause);// 1.获取一个与baseBitmap大小一致的可编辑的空图片afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),baseBitmap.getHeight(), baseBitmap.getConfig());// 2.使用Bitmap对象创建画布Canvas, 然后创建画笔Paint。canvas = new Canvas(afterBitmap);paint = new Paint();}private SeekBar.OnSeekBarChangeListener seekBarChange = new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {if(seekBar.getId() == R.id.sb_alpha){iv_show.getDrawable().setAlpha(sb_alpha.getProgress());}else{float progressR = sb_red.getProgress();float progressG = sb_green.getProgress();float progressB = sb_blue.getProgress();// 根据SeekBar定义RGBA的矩阵, 通过修改矩阵第五列颜色的偏移量改变图片的颜色float[] src = new float[]{1, 0, 0, 0, progressR,0, 1, 0, 0, progressG,0, 0, 1, 0, progressB,0, 0, 0, 1, 0};// 3.定义ColorMatrix,并指定RGBA矩阵ColorMatrix colorMatrix = new ColorMatrix();colorMatrix.set(src);// 4.使用ColorMatrix创建一个ColorMatrixColorFilter对象, 作为画笔的滤镜, 设置Paint的颜色paint.setColorFilter(new ColorMatrixColorFilter(src));// 5.通过指定了RGBA矩阵的Paint把原图画到空白图片上canvas.drawBitmap(baseBitmap, new Matrix(), paint);iv_show.setImageBitmap(afterBitmap);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}};
}
- 我们可以通过SeekBar调节RGB的值来修改图片的颜色来达到不同的效果,运行效果如下:
Android 使用ColorMatrix改变图片颜色相关推荐
- 使用asp.net改变图片颜色
最近奇葩经理提出了奇葩的需求,要能在网站上改变图片的颜色,比如灰色的变成彩色,彩色的变成灰色,尼玛楼主的感受你们不懂!于是有了下面的代码... 用法:调用update_pixelColor方法并传参数 ...
- iOS 改变图片颜色
在做项目的时候碰到了一个需求,把app的主题颜色改变成另外一种颜色,由于没有给出新的素材图片,需要把现有图片的颜色改变一下.下面是改变图片颜色的方法(一般对于单一颜色的图片) imageWithRen ...
- OpenCV for Python之改变图片颜色
OpenCV for Python之改变图片颜色 1.环境 2 直接修改通道值 3.与.或.非.异或操作 Opencv4 官方文档 : https://docs.opencv.org/4.2.0/ O ...
- Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色
Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色 项目中可能会遇到比如多个纯色圆形背景列表或者说纯色圆形头像背景,一般让UI设计师设计多张背景图:但是有更好的方法只需一张图就可 ...
- html怎么改变图片亮度,纯干货,前端学者的福音!如何使用css滤镜改变图片颜色...
原标题:纯干货,前端学者的福音!如何使用css滤镜改变图片颜色 说到对图片进行处理,我们经常会想到PS,美图秀秀这类的图像处理工具.作为前端,全栈开发者,我们经常会需要处理一些特效,例如根据不同的状态 ...
- android 图片转换圆形 黑色背景,Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色...
Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色 项目中可能会遇到比如多个纯色圆形背景列表或者说纯色圆形头像背景,一般让UI设计师设计多张背景图:但是有更好的方法只需一张图就可 ...
- 图片使用css3滤镜改变图片颜色
图片使用css3滤镜改变图片颜色 使用css3滤镜改变图片的颜色 代码如下 使用css3滤镜改变图片的颜色 我们在开发页面的时候,会遇到同一张图片滑过或点击的时候改变图片背景或颜色,一般情况下UI设计 ...
- Android开发——Java代码动态改变图片颜色
前言 在Android开发当中,我们会遇到多张图片需要改变背景颜色,我们不能用代码写死,但是我们setBackgroundColor方法改变是会被把我们背景变成直角的,但是从用户体验感的角度来讲是带有 ...
- Android使用svg格式图片,并改变图片颜色
1.在iconfont网站上下载svg格式图片,iconfont网站地址:iconfont-阿里巴巴矢量图标库,登录后下载 2.Android studio 在drawable文件夹右击,选择New- ...
最新文章
- import _winreg:用python操作修改windows注册表
- 【深度学习的数学】卷积神经网络的搭建
- ACM PKU1703 Find them, Catch them
- 腾讯看点投放系统介绍:推荐系统的进化伙伴
- 如何在Java中获得类似于C的性能
- linux比较小数大小,带有小数点的数值对比大小
- js 操作Listbox js 获取Listbox选择的值的代码
- 国家邮政局:前10月邮政行业业务收入同比增长17.8%
- js打开本地文件_JS逆向|高频问题:为何Reres插件总是替换本地文件失败?
- 华盛顿大学研发PaperID技术,可在纸上印刷RFID电子标签
- 运动目标跟踪(十九)--TLD
- ibm336服务器显示brd,ibmx3850x5服务器故障BRD报警|升级主板微码
- OpenXml 之 Excel 复制插入行
- 微信开发者工具配置服务器信息,微信开发者中心如何配置
- 数据库周刊33丨5大国产数据库中标中国移动;Oracle7月CPU安全预警;腾讯Tbase新版本发布;“2020数据技术嘉年华”有奖话题遴选;阿里云技术面试题;APEX 实现数据库自动巡检;MYSQ
- 考拉海购操作教学-API接口
- 淘宝客订单同步,关联私域授权用户,给用户返分,流程是如何串起来的
- PostgreSQL日期时间
- Python使汉字转换成url可识别的编码
- java计算机毕业设计springboot+vue居民社区健康管理平台