Android开发中经常会遇到一些简单的图片处理,比如修改图片的颜色,饱和度,亮度等。今天就给大家介绍一下简单的图片处理。

基础知识

颜色的三要素

  1. 色调(色相/颜色):物体的颜色;
  2. 饱和度(彩度):色彩的鲜艳度。颜色的纯度:0(灰)~100%(饱和);
  3. 亮度(明度):眼睛对光源和物体表面的明暗程度的感觉,主要是由光线强弱决定的一种视觉经验。

ARGB模型

A:alpha,透明度;
R:red,红色;
G:green,绿色;
B:blue,蓝色;

屏幕是由一定的像素点组合而成的,比如1920*1080,而每一个像素点都是由argb模型组合成的。

代码

  1. 布局文件
<?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:orientation="vertical"><ImageView
        android:layout_margin="10dp"android:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="200dp" /><SeekBar
        android:id="@+id/seekBarHue"android:layout_width="match_parent"android:layout_height="wrap_content" /><SeekBar
        android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:id="@+id/seekBarSaturation"android:layout_width="match_parent"android:layout_height="wrap_content" /><SeekBar
        android:id="@+id/seekBarLum"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>

2.PrimaryColorActivity

public class PrimaryColorActivity extends Activity implements SeekBar.OnSeekBarChangeListener {private ImageView imageView;//修改色相private SeekBar seekBarHue;//修改饱和度private SeekBar seekBarSaturation;//修改亮度private SeekBar seekBarLum;//seekbar最大值private static final int MAX_VALUE = 255;//seekbar中间值 起始值private static final int MID_VALUE = 127;//当前图片的色相,饱和度,亮度private float mHue, mSaturation, mLum;//显示的图片private Bitmap bitmap;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_color_primary);bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baikal1);imageView = (ImageView) findViewById(R.id.imageView);seekBarHue = (SeekBar) findViewById(R.id.seekBarHue);seekBarSaturation = (SeekBar) findViewById(R.id.seekBarSaturation);seekBarLum = (SeekBar) findViewById(R.id.seekBarLum);seekBarHue.setOnSeekBarChangeListener(this);seekBarSaturation.setOnSeekBarChangeListener(this);seekBarLum.setOnSeekBarChangeListener(this);seekBarHue.setMax(MAX_VALUE);seekBarSaturation.setMax(MAX_VALUE);seekBarLum.setMax(MAX_VALUE);seekBarHue.setProgress(MID_VALUE);seekBarSaturation.setProgress(MID_VALUE);seekBarLum.setProgress(MID_VALUE);imageView.setImageBitmap(bitmap);}//mHue, mSaturation, mLum的计算公式为经验公式   不是固定的@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {switch (seekBar.getId()) {case R.id.seekBarHue:mHue = (progress - MID_VALUE) * 1.0f / MID_VALUE * 180;break;case R.id.seekBarSaturation://饱和度取值 0 - 2mSaturation = progress * 1.0f / MID_VALUE;break;case R.id.seekBarLum://亮度取值 0 - 2mLum = progress * 1.0f / MID_VALUE;break;}imageView.setImageBitmap(ImageHelper.handleImageEffect(bitmap, mHue, mSaturation, mLum));}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}
}

3.ImageHelper

public class ImageHelper {/*** 色相* 饱和度* 亮度*/public static Bitmap handleImageEffect(Bitmap bitmap, float hue, float saturation, float lum) {//传进来的bitmap默认不能修改  所以再创建一个bmBitmap bm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);//画布Canvas canvas = new Canvas(bm);//抗锯齿Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//颜色矩阵ColorMatrix hueMatrix = new ColorMatrix();//修改色相   0 red 1 green 2 bluehueMatrix.setRotate(0, hue);hueMatrix.setRotate(1, hue);hueMatrix.setRotate(2, hue);//修改饱和度ColorMatrix saturationMatrix = new ColorMatrix();saturationMatrix.setSaturation(saturation);//修改亮度ColorMatrix lumMatrix = new ColorMatrix();//r g b a    1 表示全不透明lumMatrix.setScale(lum, lum, lum, 1);//组合MatrixColorMatrix imageMatrix = new ColorMatrix();imageMatrix.postConcat(hueMatrix);imageMatrix.postConcat(saturationMatrix);imageMatrix.postConcat(lumMatrix);//为画笔设置颜色过滤器paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));//在canvas上照着bitmap画canvas.drawBitmap(bitmap, 0, 0, paint);return bm;}
}

现在将程序运行,移动seekbar,应该就可以看到效果了。
总结:图片处理其实就是利用ColorMatrix对每一个像素点的处理,对于ColorMatrix,我会单独写一个博客继续讲解的,谢谢大家!

修改图片颜色 色相 饱和度 亮度 ColorMatrix相关推荐

  1. PHP HSV色相 饱和度 亮度 增强

    PHP HSV色相 饱和度 亮度 增强 在开始之前我们先了解一下什么是HSV HSV 是颜色模型 色调H 用角度度量,取值范围为0°-360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°, ...

  2. html修改img图片颜色,教你如何用CSS修改图片颜色

    原标题:教你如何用CSS修改图片颜色 看到题目是不是吓了一跳?css竟然还有这个操作?还真是第一次听说~ 原理嘛,其实很简单的,用到的就是 CSS3 滤镜filter中的drop-shadow,该滤镜 ...

  3. JTOPO 修改图片颜色

    其实JTOTO中报警的处理是通过设置:alarm.alarmColor和setImage(url)来实现的. alarm属性不为null表示有节点报警: alarmColor属性设置报警时图片的颜色. ...

  4. PS CC 2015 修改图片颜色和大小

    为什么修改图片颜色? [预期:]设计师给的设计稿两种颜色的图片,图片尺寸要求是48x48像素,一张绿色,一张白色. [实际]绿色图片符合要求,白色图片是40x40像素,偏小.测试妹子不干了!!! [解 ...

  5. iOS 修改图片颜色

    iOS小菜一碟:1:用代码修改图片颜色 首先需要是Xcode的assets里面的图片 选中图片 DraggedImage-1.png 在属性面板里可以看到Render As,选择Template Im ...

  6. android 修改png颜色,安卓修改图片颜色

    //主要用到ColorMatrix.如果只是想要设置灰色 setSaturation(0) ImageView logo = findViewById(R.id.logo); ColorMatrix ...

  7. 【python-小工具-3】抠图-透明化背景-修改图片颜色

    1.图片处理-修改颜色 有时候有种困扰!把网上的截屏,或者一般图片拖到PPT或者其他文档里面去,会有一个明显的白底框框. 放进PPT里面也太丑了点,干脆把图片的白底给弄透明,可就为这下个PS,不符合程 ...

  8. 技巧分享:如何利用CSS属性修改图片颜色?

    熟悉前端开发的小伙伴肯定有遇到过这种情况,那就是需要给一个图标或者图片增加一个移动变色等属性,传统做法就是再添加一个颜色的图片文件替换,那么有没有可能直接利用css属性来变更颜色呢? 其实是可以实现的 ...

  9. python实现批量修改图片颜色

    原本图片有两个颜色,但是颜色太接近了,看不清楚,所以使用以下程序把所有灰色转换成白色,看的更清晰. import os from PIL import Image# 源目录 MyPath = 'D:/ ...

最新文章

  1. linux 网络错误 nf_conntrack: table full, dropping packet. 路由跟踪表满
  2. python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?
  3. 三次握手,四次挥手?
  4. OC类导入Swift工程演示
  5. python 嵌套型partials(nested partials)的使用
  6. 鸿蒙王者荣耀想要转区吗,王者荣耀:跨系统角色转移功能终于上线,想要成功转区,这九点常识必须要知道!...
  7. Vue.js 2.5 发布,而这个会玩的团队已经自研出用 Vue 开发小程序的框架了
  8. Abseil之字符串连接
  9. JavaScript运算符的概述分类及其优先级
  10. python windows故障处理_python+windows automation windows有时会出现故障
  11. python怎么重新运行,如何让python程序重新运行其
  12. VMware和Centos安装使用
  13. Liquibase修改表字段
  14. camera基础概念之等效焦距 视场角的计算
  15. Python之OpenGL笔记(30):飘扬的旗帜
  16. 电商平台如何实现分账功能
  17. C# 串口助手中英文显示问题
  18. 2021免费大容量OneDrive + office 365桌面版 (a1 a1p)
  19. Linux应用基础——串口应用编程
  20. iconfont图标无法显示的问题

热门文章

  1. R语言简单的频数统计图
  2. 魔戒:咕噜发售日确定 将于9月1日发布
  3. 「得到」的竞品是谁?「王者荣耀」啊!
  4. Delphi XE7 发布了
  5. java作用域外调用对象,Java Web应用中往往通过设置不同作用域的属性来达到通讯的目的。 如果某个对象只在同一请求中共享,通过调用哪个类 的setAttribute方法设置属性。( )...
  6. 百度首次发布3D地图 杨洋导航语音完整版上线
  7. oracle修改用户表所属空间,Oracle修改用户表所属表空间的步骤
  8. Android--简单电子木鱼开发详解
  9. 区块链在游戏产业掀起狂潮
  10. Marlin架构解析