安卓实现为图片添加滤镜功能

相机中有一个功能:滤镜。 我们一点击某种样式(怀旧色、反色、暖色等等)那么这个功能是如何实现的呢?
想要实现这个功能我们首先要了解什么是滤镜?现实中如何实现滤镜?
带着这个问题,我们开始思考。
在实际生活中,彩色透明玻璃相信大家都见过,其实这种玻璃就是一个滤镜,我们透过彩色玻璃看对面的画面,画面的整个色调就会变得跟玻璃的颜色贴近,这样就实现了滤镜功能。那么在代码中我们如何去设计和实现呢?
有了彩色玻璃这个例子,我们很容易就能想到,我们用代码写一个图层,图层用我们想要过滤的颜色填充,然后更改图层的透明度,这样不就是自己制作了一个“彩色玻璃”吗?
答案是肯定的,这样好像不能完全实现滤镜功能,比如:我们想要一个照片的底片效果,那我们用什么“彩色玻璃”去过滤呢?黑色?很明显这样不合适。那我们继续思考,“彩色玻璃”的实际原理是什么?想要弄清楚这个,我们就需要了解颜色原理了。我们这里不多提。(其实笔者也不是太懂T_T)我们只需要知道在每一个颜色值都是一个5*4的二维矩阵,例如:
颜色矩阵
这里第一行决定红色、第二行决定绿色、第三行决定蓝色、第四行决定了透明度。第五列是颜色的偏移量。
而在android中这个二维矩阵被处理成了一维矩阵!
颜色矩阵以一维数组的方式存储如下:
[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
我们通过RGBA四个通道来直接操作对应颜色,如果会使用Photoshop就会知道有时处理图片通过控制RGBA各颜色通道来做出特殊的效果。
而图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,由颜色分量矩阵C可以控制图像的颜色效果
通道图层
要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可。通过颜色矩阵可以很方便的修改图像的颜色分量矩阵。假设修改后的图像颜色分量矩阵为C1,则有如下图所示的颜色分量矩阵计算公式。
颜色分量矩阵计算公式
M是颜色矩阵,C矩阵是图片中包含的RGBA信息,R矩阵是用M应用于C之后的新的颜色分量。即通过这种形式我们可以通过改变C矩阵的值任意改变一个颜色。
过上图所示的运算可知,颜色矩阵M的第一行参数abcde决定了图像的红色成分,第二行参数fghij决定了图像的绿色成分,第三行参数klmno决定了图像的蓝色成分,第四行参数pqrst决定了图像的透明度,第五列参数ejot是颜色的偏移量。
一般情况下,我们都通过修改第5列的颜色偏移量来实现改变颜色,如下图所示的颜色矩阵M1,通过计算后可以得知该颜色矩阵的作用是使图像的红色分量和绿色分量均增加100,这样的效果就是图片泛黄(因为红色与绿色混合后得到黄色)。
这里写图片描述
除此之外,也可以通过直接对颜色值乘以某一系数而达到改变颜色分量的目的。如下图所示的颜色矩阵M2,将绿色分量放大了2倍,这样的效果就是图片泛绿色。
这里写图片描述
好了扯了这么多了,还是来点实在的,上代码:

这个是JavaActivity代码

package com.lx.androidday07;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值