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 ...
随机推荐
- 当mysql遇上PHP
博客提纲 利用PHP连接mySQL数据库 两套接口:面向对象和面向过程 实现写改删查(CUBD)实例 通过prepare语句处理相同类型的不同SQL语句 通过bind_param()绑定参数,及相关注 ...
- PHP+MySql实现后台数据的读取
我们使用的是PHP 的php_mysqli扩展 首先了解一些基础的用法 1.连接数据库使用 mysqli_connect() 参数:①主机地址 ②MYSQL用户名 ③MYSQL密码 ④选择 ...
- ecshop的aes加密(封装)
从一家做shopex,ecstore的公司到一家做b2b的ecshop的公司...来了就要实战,其他的不说了,先来了解什么是php的aes加密吧? aes(高级加密标准),AES的区块长度固定为128 ...
- 2017-06-22初识python
初识python #!/usr/bin/env python (python解释器的文件路径)# -*- coding:utf-8 -*- (使用的编码内型)# python 2.7 <需要加第 ...
- 无法将类型为excel.applicationclass的com 强制转换为接口类型的解决方法[转]
c#解决方案EXCEL 导出 今天碰到客户的电脑在导出EXCEL的时候提示,无法将类型为 excel.applicationclass 的 com 强制转换为接口类型 excel._applicati ...
- 如何使用slice,substr代替substring(原创)
//写这个是为了加深对substring和slice的理解 substring: 任何一个参数小于0,都会被替换成0.两个参数,最小值会被当做start,最大值当做end. 参数 描述 start 必 ...
- Vijos 1025 小飞侠的游园方案 0-1背包
描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...
- powershell 统计AD中所有计算机及对应的操作系统信息
要想用powershell管理域,首先先加载activedirectory模块 PS C:\> import-module activedirectory 下面就可以利用get-adcomput ...
- Unity3D-Shader-实现X光效果
[旧博客转移 - 2016年1月3日 16:40 ] 最近学习了一些Shader效果,打算把学到的知识总结一下,这篇讲一下这种轮廓发光的效果(如下图所示),也有一些地方管这个叫X光 1.原理 ...
- DotNetCore跨平台~服务总线_事件总线的重新设计
理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...