文档章节

Android Camera 实时滤镜(七)

wyhuan
 wyhuan
发布于 2016/01/26 11:13
字数 796
阅读 9
收藏 0

HSL色彩模式与RGB色彩模式转换代码实现

RGB色彩模式

这里写图片描述

HSL色彩模式

这里写图片描述

HSL色彩模式与RGB色彩模式转换算法

HSL与RGB转换

  • RGB类
public class ColorRGB {

    public int r;
    public int g;
    public int b;

}
  • HSL类
public class ColorHSL {

    public int h;
    public float s;
    public float l;

}

a) RGB→HSL的算法描述。

步骤1:把RGB值转成【0,1】中数值。
步骤2:找出R,G和B中的最大值。
步骤3:设L=(maxcolor + mincolor)/2
步骤4:如果最大和最小的颜色值相同,即表示灰色,那么S定义为0,而H未定义并在程 序中通常写成0。
步骤5:否则,测试L:
  If L<0.5, S=(maxcolor-mincolor)/(maxcolor + mincolor)
  If L>=0.5, S=(maxcolor-mincolor)/(2.0-maxcolor-mincolor)
步骤6: If R=maxcolor, H=(G-B)/(maxcolor-mincolor)
  If G=maxcolor, H=2.0+(B-R)/(maxcolor-mincolor)
  If B=maxcolor, H=4.0+(R-G)/(maxcolor-mincolor)
步骤7:从第6步的计算看,H分成0~6区域。RGB颜色空间是一个立方体而HSL颜色空间是两个六角形锥体,其中的L是RGB立方体的主对角线。因此,RGB立方体的顶点:红、黄、绿、青、蓝和品红就成为HSL六角形的顶点,而数值0~6就告诉我们H在哪个部分。H=H*60.0,如果H为负值,则加360。

private static ColorHSL colorRGBToHSL(ColorRGB rgb) {

    ColorHSL hsl = new ColorHSL();

    float r, g, b, h, s, l;
    r = rgb.r / 255.0f;
    g = rgb.g / 255.0f;
    b = rgb.b / 255.0f;

    float maxColor = Math.max(r, Math.max(g, b));
    float minColor = Math.min(r, Math.min(g, b));

    if (maxColor == minColor) {
        h = 0.0f;
        s = 0.0f;
        l = r;
    } else {
        l = (minColor + maxColor) / 2;

        if (l < 0.5)
            s = (maxColor - minColor) / (maxColor + minColor);
        else
            s = (float) ((maxColor - minColor) / (2.0 - maxColor - 
                 minColor));

        if (r == maxColor)
            h = (g - b) / (maxColor - minColor);
        else if (g == maxColor)
            h = (float) (2.0 + (b - r) / (maxColor - minColor));
        else
            h = (float) (4.0 + (r - g) / (maxColor - minColor));

        h /= 6;
        if (h < 0)
            h++;
    }

    hsl.h = (int) Math.round(h * 360.0);
    hsl.s = s;
    hsl.l = l;

    return hsl;
}

b) HSL→RGB的算法描述。

步骤1:If S=0,表示灰色,定义R,G和B都为L.
步骤2:否则,测试L:
   If L<0.5,temp2=L*(1.0+S)
   If L>=0.5,temp2=L+S-L*S
步骤3:temp1=2.0*-temp2
步骤4:把H转换到0~1。
步骤5:对于R,G,B,计算另外的临时值temp3。方法如下:
   for R, temp3=H+1.0/3.0
   for G, temp3=H
   for B, temp3=H-1.0/3.0
   if temp3<0, temp3=temp3+1.0
   if temp3>1, temp3=temp3-1.0
步骤6:对于R,G,B做如下测试:
   If 6.0*temp3<1,color=temp1+(temp2-temp1)*6.0*temp3
   Else if 2.0*temp3<1,color=temp2
   Else if 3.0*temp3<2,
   color=temp1+(temp2-temp1)*((2.0/3.0)-temp3)*6.0
   Else color=temp1

private static ColorRGB colorHSLToRGB(ColorHSL hsl) {

    ColorRGB rgb = new ColorRGB();

    float r, g, b, h, s, l;
    float temp1, temp2, tempr, tempg, tempb;
    h = hsl.h / 360.0f;
    s = hsl.s;
    l = hsl.l;


    if (s == 0) {
        r = g = b = l;
    } else {
        if (l < 0.5)
            temp2 = l * (1 + s);
        else
            temp2 = (l + s) - (l * s);
        temp1 = 2 * l - temp2;
        tempr = (float) (h + 1.0 / 3.0);
        if (tempr > 1)
            tempr--;
        tempg = h;
        tempb = (float) (h - 1.0 / 3.0);
        if (tempb < 0)
            tempb++;

        // Red
        if (tempr < 1.0 / 6.0)
            r = (float) (temp1 + (temp2 - temp1) * 6.0 * tempr);
        else if (tempr < 0.5)
            r = temp2;
        else if (tempr < 2.0 / 3.0)
            r = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempr)
                        * 6.0);
        else
            r = temp1;

        // Green
        if (tempg < 1.0 / 6.0)
            g = (float) (temp1 + (temp2 - temp1) * 6.0 * tempg);
        else if (tempg < 0.5)
            g = temp2;
        else if (tempg < 2.0 / 3.0)
            g = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempg)
                        * 6.0);
        else
            g = temp1;

        // Blue
        if (tempb < 1.0 / 6.0)
            b = (float) (temp1 + (temp2 - temp1) * 6.0 * tempb);
        else if (tempb < 0.5)
            b = temp2;
        else if (tempb < 2.0 / 3.0)
            b = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempb)
                        * 6.0);
        else
            b = temp1;
    }

    rgb.r = (int) Math.round(r * 255.0);
    rgb.g = (int) Math.round(g * 255.0);
    rgb.b = (int) Math.round(b * 255.0);

    return rgb;
}

© 著作权归作者所有

wyhuan
粉丝 1
博文 171
码字总数 146419
作品 0
大连
私信 提问
Vitamio旗下短视频拍摄SDK VCamera 发布

Camera SDK Android 版(短视频拍摄 SDK)是炫一下(北京)科技有限公 司官方推出的 Android 平台使用的软件开发工具包,为 Android 开发者提供简单、 快捷的接口,帮助开发者实现 Android 平台上的...

熊猫与猫无关
2014/05/21
14.8K
5
Android 音视频开发入门指南(2)

GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛不欲生时就只有使用GLSurfaceView了,它能够真正做...

shareus
2018/04/23
0
0
照相机滤镜使用,优化解码和滤镜导致的预览卡屏现象

这几天看到亚瑟boy的技术连载,也试着做了下带滤镜特效的照相机,效果也出来了,但是发现添加滤镜特效后的预览窗口卡屏现象很严重,于是自己索性试着尝试修改,在亚瑟和其他网友的代码中基本...

长平狐
2012/08/21
472
0
照相机滤镜使用,优化解码和滤镜导致的预览卡屏现象

这几天看到亚瑟boy的技术连载,也试着做了下带滤镜特效的照相机,效果也出来了,但是发现添加滤镜特效后的预览窗口卡屏现象很严重,于是自己索性试着尝试修改,在亚瑟和其他网友的代码中基本...

长平狐
2012/08/14
194
0
照相机滤镜使用,优化解码和滤镜导致的预览卡屏现象

这几天看到亚瑟boy的技术连载,也试着做了下带滤镜特效的照相机,效果也出来了,但是发现添加滤镜特效后的预览窗口卡屏现象很严重,于是自己索性试着尝试修改,在亚瑟和其他网友的代码中基本...

长平狐
2012/08/09
204
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
44分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
123
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部