参考自: 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. Linux网络服务10——远程访问及控制

    Linux网络服务10--远程访问及控制 一.SSH概述 1.SSH简介 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能.SSH协议对通信双方的数 ...

  2. angular-ui-alert

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. js将字符串转化成函数:eval(logOutCallbackFun+"()");

    js将字符串转化成函数:eval(logOutCallbackFun+"()");

  4. MySQL删除表方式差异

    数据库删除语句 Drop/Delete/Truncate比较 Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名 ...

  5. IOS 固定定位底部input输入框,获取焦点时弹出的输入法键盘挡住input

    移动页面经常会做到这样一个效果,看下面的图片,重点就是那个固定定位的底部,里面有个input输入框,在输入字符的时候,安卓手机看着是完全没有问题! 1.页面没有点击底部input的初始状态 2.安卓手 ...

  6. 使用UDP完成网络通信

    语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来 传输数据提高效率. 因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些 操作的正确执行,还是需要一些额外的代码保证U ...

  7. Chapter 2. Video Formats and Quality

    本章节主要介绍一些视频格式相关的基础知识. 交织(Interlace) 即每一个采样帧采样时隔行采样,奇数行和偶数行交替. YCbCr 人眼视觉系统(Human Visual System, HVS) ...

  8. example001点击隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Ext & Java 上存图片 Demo

    Ext & Java 上存图片 Demo Ext <html> <head> <script id="microloader" type=&q ...

  10. angularjs directive (自定义标签解析)

    angularjs directive (自定义标签解析) 定义tpl <!-- 注意要有根标签 --> <div class="list list-inset" ...