参考自: https://github.com/BradLarson/GPUImage

GPUImageRGBFilter: Adjusts the individual RGB channels of an image

  • red: Normalized values by which each color channel is multiplied. The range is from 0.0 up, with 1.0 as the default.
  • green:
  • blue:

对应的Shader:

varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;
 uniform highp float redAdjustment;
 uniform highp float greenAdjustment;
 uniform highp float blueAdjustment;

 void main()
 {
     highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

     gl_FragColor = vec4(textureColor.r * redAdjustment, textureColor.g * greenAdjustment, textureColor.b * blueAdjustment, textureColor.a);
 }

简单解释一下以上Shader.

uniform 声明为只读变量。
varying 声明为读写变量。
highp 为计算精度。这里为高精度。
textureCoordinate为对应的纹理坐标位置即(x,y)

inputImageTexture为输入的纹理图。
texture2D 取对应纹理图所在坐标的像素颜色。
所以整个算法很简单,就是将对应纹理图所在坐标的像素进行相应的 红绿蓝 权重调整。
权重的取值范围为[0,1]

根据以上Shader进行CPU代码转换。

#ifndef ClampToByte
#define ClampToByte(v)(((unsigned) int(v)) < (255) ? (v) : (v < 0) ? int(0) : int(255))
#endif

void CPUImageRGBFilter(unsigned char* Input, unsigned char* Output, int  Width, int  Height, int Stride, float redAdjustment = 1.0f, float greenAdjustment = 1.0f, float blueAdjustment = 1.0f)
{
    int Channels = Stride / Width;
    )      return;
    int numberOfPixels = Width*Height;
    unsigned char* scanLineIn = Input;
    unsigned char* scanLineOut = Output;
    ; pixel < numberOfPixels; pixel++) {
        scanLineOut[] = ClampToByte(scanLineIn[] * redAdjustment);
        scanLineOut[] = ClampToByte(scanLineIn[] * greenAdjustment);
        scanLineOut[] = ClampToByte(scanLineIn[] * blueAdjustment);
        scanLineIn += Channels;
        scanLineOut += Channels;
    }
}

转换后可进行建表优化。

即:

void CPUImageRGBFilter(unsigned char* Input, unsigned char* Output, int  Width, int  Height, int Stride, float redAdjustment = 1.0f, float greenAdjustment = 1.0f, float blueAdjustment = 1.0f)
{
    int Channels = Stride / Width;
    )      return;
    unsigned ] = {  };
    unsigned ] = {  };
    unsigned ] = {  };
    ; pixel < ; pixel++)
    {
        AdjustMapR[pixel] = pixel*redAdjustment;
        AdjustMapG[pixel] = pixel*greenAdjustment;
        AdjustMapB[pixel] = pixel*blueAdjustment;
    }
    ; Y < Height; Y++)
    {
        unsigned char*     scanLineOut = Output + (Y * Stride);
        unsigned char*     scanLineIn = Input + (Y * Stride);
        ; X < Width; X++)
        {
            scanLineOut[] = AdjustMapR[scanLineIn[]];
            scanLineOut[] = AdjustMapG[scanLineIn[]];
            scanLineOut[] = AdjustMapB[scanLineIn[]];
            scanLineIn += Channels;
            scanLineOut += Channels;
        }
    }
}

代码比较简单,一看就明了。

待后续有时间,再通过simd指令集以及thread等方式进行改写。

CPUImageRGBFilter 实现的更多相关文章

  1. cpuimage 开源之

    前年学习opengl做的一个小东西. 原本计划将gpuimage 的算法一个一个转写成cpu版本 c,c++ 版本. gpuimage 项目参考: https://github.com/BradLar ...

随机推荐

  1. mysql安装不上 failed to install the service

    先前安装的没有卸载干净必须删除相应的注册表方法如下:1)“运行”中敲入“Regedit”进入注册表编辑2)HKEY_LOCAL_MACHINE->SYSTEM->ControlSet001 ...

  2. 【Android Developers Training】 106. 创建并检测地理围栏

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. JAX-RS REST 服务结果的自动封装

    如转发请注明: 原文luyiisme博客 当使用遵循 JAX-RS 标准的框架开发REST 服务时,我们倾向于定义个(含有JAX-RS)注解接口. 服务器端负责实现该接口,而客户端是该接口的代理进行远 ...

  4. protobuf转json

    方法介绍 protobuf的介绍在这里就不详细介绍了,主要是俺也是刚接触,感兴趣的同学可以去搜索相关博客或者直接去看源码以及google的官方文档(官方文档表示很吃力)或者去这个网站:https:// ...

  5. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...

  6. Android精品源码与技术博文

    Android精品源码android遵循Material Design风格天气源码基于exoplay 自定义播放器 支持直播 1 ExoUserPlayer 基本播放器...几种动画效果Animati ...

  7. 关于MySQL用户会话及连接线程

    0.概念理解:用户会话和连接线程是什么关系? 用户会话和用户连接线程是一一对应的关系,一个会话就一个用户连接线程. 问题描述: 如果系统因为执行了一个非常大的dml或者ddl操作导致系统hang住,我 ...

  8. JavaWeb 后端 <六> 之 EL & JSTL 学习笔记

    一.EL表达式(特别重要)

  9. jsp实现上一页下一页翻页功能

    前段时间一直忙于期末考试和找实习,好久没写博客了. 这段时间做了个小项目,包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深,打算玩深后再写篇博客. 要实现翻页功能,只需 ...

  10. DDD理论学习系列(11)-- 工厂

    DDD理论学习系列--案例及目录 1.引言 在针对大型的复杂领域进行建模时,聚合.实体和值对象之间的依赖关系可能会变得十分复杂.在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻 ...