CPUImageRGBFilter 实现
参考自: 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 实现的更多相关文章
- cpuimage 开源之
前年学习opengl做的一个小东西. 原本计划将gpuimage 的算法一个一个转写成cpu版本 c,c++ 版本. gpuimage 项目参考: https://github.com/BradLar ...
随机推荐
- Linux网络服务10——远程访问及控制
Linux网络服务10--远程访问及控制 一.SSH概述 1.SSH简介 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能.SSH协议对通信双方的数 ...
- angular-ui-alert
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js将字符串转化成函数:eval(logOutCallbackFun+"()");
js将字符串转化成函数:eval(logOutCallbackFun+"()");
- MySQL删除表方式差异
数据库删除语句 Drop/Delete/Truncate比较 Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名 ...
- IOS 固定定位底部input输入框,获取焦点时弹出的输入法键盘挡住input
移动页面经常会做到这样一个效果,看下面的图片,重点就是那个固定定位的底部,里面有个input输入框,在输入字符的时候,安卓手机看着是完全没有问题! 1.页面没有点击底部input的初始状态 2.安卓手 ...
- 使用UDP完成网络通信
语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来 传输数据提高效率. 因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些 操作的正确执行,还是需要一些额外的代码保证U ...
- Chapter 2. Video Formats and Quality
本章节主要介绍一些视频格式相关的基础知识. 交织(Interlace) 即每一个采样帧采样时隔行采样,奇数行和偶数行交替. YCbCr 人眼视觉系统(Human Visual System, HVS) ...
- example001点击隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ext & Java 上存图片 Demo
Ext & Java 上存图片 Demo Ext <html> <head> <script id="microloader" type=&q ...
- angularjs directive (自定义标签解析)
angularjs directive (自定义标签解析) 定义tpl <!-- 注意要有根标签 --> <div class="list list-inset" ...