Android ( ColorMatrixColorFilter ) 颜色矩阵颜色滤镜通过一个 4x 5 的颜色矩阵来变换颜色,可以修改像素的饱和度,将 YUV 转换成 RGB 等

相关知识

RGB

RGB 就是红绿蓝,光的三基色

Red 红

Green 绿

Blue 蓝

RGBA 模型

RGBA 就是 RGB + Alpha (透明度)

色调/色相

三原色指色彩中不能再分解的三种基本颜色,通常说的三原色,即品红、黄、青 (是青不是蓝,蓝是品红和青混合的颜色)

三原色可以混合出所有的颜色,同时相加为黑色,黑白灰属于无色系

三原色是物体传递的颜色

饱和度

颜色的纯度,从 0(灰) 到 100%(饱和) 来进行描述

亮度/明度

颜色的相对明暗程度

ColorMatrix

颜色矩阵( 4x5 ),我们可以修改矩阵中的值,来实现黑白照,泛黄老照片,高对比度等效果

手撕颜色矩阵解释图如下

拿颜色矩阵的每一行来 * 颜色矩阵分量的每一列

很典型的一个例子,处理前后的结果比较,我们还可以让 某个颜色值 * 一个常数 ,比如让第三行(蓝)乘以 2,效果就变成泛蓝色了

验证 ColorMatrix 所起的作用

一个 ImageView,4x5 个 EditText,一个重置按钮和一个生成按钮,

依次是原图,泛黄,泛绿,泛红,高对比度,色相变换,以及黄色复古

创建一个 空的 Android 项目 cn.twle.android.ColorMatrix

修改布局文件 activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:padding="5dp">

android:id="@+id/img_show"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="2" />

android:id="@+id/gp_matrix"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="3"

android:columnCount="5"

android:rowCount="4">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:id="@+id/btn_reset"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="重置" />

android:id="@+id/btn_Change"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="变换" />

修改 MainActivity.java

package cn.twle.android.colormatrix;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.ColorMatrixColorFilter;

import android.graphics.Paint;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.GridLayout;

import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ImageView img_show;

private GridLayout gp_matrix;

private Button btn_reset;

private Button btn_Change;

private Bitmap mBitmap;

private int mEtWidth, mEtHeight;

private EditText[] mEts = new EditText[20];

private float[] mColorMatrix = new float[20];

private Context mContext;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mContext = MainActivity.this;

bindViews();

gp_matrix.post(new Runnable() {

@Override

public void run() {

mEtWidth = gp_matrix.getWidth() / 5;

mEtHeight = gp_matrix.getHeight() / 4;

//添加5 * 4个EditText

for (int i = 0; i < 20; i++) {

EditText editText = new EditText(mContext);

mEts[i] = editText;

gp_matrix.addView(editText, mEtWidth, mEtHeight);

}

initMatrix();

}

});

}

private void bindViews() {

img_show = (ImageView) findViewById(R.id.img_show);

gp_matrix = (GridLayout) findViewById(R.id.gp_matrix);

btn_reset = (Button) findViewById(R.id.btn_reset);

btn_Change = (Button) findViewById(R.id.btn_Change);

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mychild);

img_show.setImageBitmap(mBitmap);

btn_reset.setOnClickListener(this);

btn_Change.setOnClickListener(this);

}

//定义一个初始化颜色矩阵的方法

private void initMatrix() {

for (int i = 0; i < 20; i++) {

if (i % 6 == 0) {

mEts[i].setText(String.valueOf(1));

} else {

mEts[i].setText(String.valueOf(0));

}

}

}

//定义一个获取矩阵值得方法

private void getMatrix() {

for (int i = 0; i < 20; i++) {

mColorMatrix[i] = Float.valueOf(mEts[i].getText().toString());

}

}

//根据颜色矩阵的值来处理图片

private void setImageMatrix() {

Bitmap bmp = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(),

Bitmap.Config.ARGB_8888);

android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix();

colorMatrix.set(mColorMatrix);

Canvas canvas = new Canvas(bmp);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));

canvas.drawBitmap(mBitmap, 0, 0, paint);

img_show.setImageBitmap(bmp);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_Change:

getMatrix();

setImageMatrix();

break;

case R.id.btn_reset:

initMatrix();

getMatrix();

setImageMatrix();

break;

}

}

}

post() 方法是为了保证 GridLayout 加载完毕后才去获取长宽,不然在获取 GridLayout 长

宽的时候可是获取不到值的

参考文档

rgb矩阵Android程序,Android ColorMatrixColorFilter相关推荐

  1. 时间计时android程序,Android 时间计时器控件 Chronometer

    当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...

  2. 任意的android程序,Android任意位置获取应用Context

    在编写某些自定义类时,无法方便的取得Context(Activity或Application),例如需要获取res资源,取些drawable或string之类的,通常会比较麻烦. 解决方法一般有: 1 ...

  3. 独数游戏android程序,Android 数独小游戏

    先看看效果图 sudoku-o3.gif 数独设计思路 先看布局,我们可以看到数独由9x9的格子组成,每个格子中间有一个数字. Cell (单个格子.android 中我们可以先用TextView代替 ...

  4. android开发图片格式,Android程序开发如何处理图像格式类及图像转换

    在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...

  5. Unity3D移植到自己的Android程序

    用Unity3D开发需要把动画效果移植到现有的APP上面.Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添 ...

  6. Android -- 程序启动画面 Splash

    很多应用都会有一个启动界面.欢迎画面慢慢隐现,然后慢慢消隐. 我的方式是使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一 ...

  7. android程序安装后图标不显示

    本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中..一般这种情况只会在服务 ...

  8. android程序在调试时出现了套接字异常“java.net.SocketException: Permission denied”该如何解决...

    Socket不能对外连接,错误不会被报出,调试的时候,能看到Exception, 一般是抛出 java.net.socketexception permission denied这个异常.只要你的程序 ...

  9. Android程序员的技术要求和学习路线

    转载自知乎上关于Android程序员技术等级标准的回答: 如上图所描述的技能要求,可分为下面几大模块: 通用知识 编程语言 Android 编码与设计 工具和方法 对应学习线路如下 书籍准备: 1.疯 ...

  10. Android 程序自动更新功能模块实现

    2019独角兽企业重金招聘Python工程师标准>>> Android 程序自动更新功能模块实现 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程 ...

最新文章

  1. Delphi - 新语法介绍之For In
  2. Duilib vlc c++ 字符编码
  3. 循序渐进学Python2变量与输入
  4. udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
  5. MySQL主从复制遇到的问题以及如何解决
  6. Android将应用调试log信息保存在SD卡
  7. [在线小说系统源码]精品微信小程序小说阅读器+后台管理系统|前后分离VUE[包运行成功]
  8. 国密(1) - 私钥Key文件( PEM格式)编解码方法
  9. 苹果电脑桌面计算机图标不见了怎么办,苹果电脑桌面文件都不见了怎么显示
  10. 移动游戏运营必备的数据分析指标
  11. android 获取快捷开关_Android11新功能汇总,悬浮聊天气泡、快捷开关颜色可调整等...
  12. css中的position和float属性
  13. DynamoDB安装及配置
  14. 人工智能的三个发展阶段
  15. 【R语言】必学包之plyr包
  16. 【云原生】阿里云ACK部署MySQL 数据持久化存储
  17. 从UEFI安装服务器系统,UEFI+GPT模式安装Windows server 2008 R2教程
  18. 计算机升级在线,电脑ipad在线升级的方法
  19. linux文件对用户隐藏,Linux就该这么学-文件的特殊权限、隐藏权限
  20. jquery 监听td点击事件_React 事件 | 1. React 中的事件委托

热门文章

  1. 关于在GridControl中添加GridLookUpEdit绑定数据
  2. jQuery2.x源码解析(设计篇)
  3. ecshop 实现购物车退出不清空
  4. WEBFORM--第一讲
  5. CMake实践(2)
  6. 杭电1085(多重背包求解)
  7. 在word表格里打勾和打叉
  8. WinForm中显示韩语,韩文
  9. MybatisPlusExcepection: can not find lambda cache for this property [XX] for entity [xxx]
  10. java图片像素90翻转_java后台解决上传图片翻转90的问题,有demo,经过测试可用...