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 ...
随机推荐
- mybatis if test加筛选条件
最近在项目使用mybatis中碰到个问题 <if test="type=='y'"> and status = 0 </if> 当传入的type的值为y的时 ...
- Linux下Shadow socks的安装和配置
实在受不了在Windows下编程,所以自己就安装了一个Ubutun,公司用的FQ软件shadowsocks在Windows上用起来很简单很爽,但是在Ubutun上的安装和配置就没那么简单了,写下这篇文 ...
- php中的XML转数组
/** * 最简单的XML转数组 * @param string $xmlstring XML字符串 * @return array XML数组 */ function simplest_xml_to ...
- AngularJs学习笔记0——前言
距离上次写博客有很长时间了,这段时间中也一直想坚持写博客,但是迟迟未动,一方面是因为刚换工作并适应新的环境导致工作比较忙碌,一直没有抽出时间来,其实说白了就是给自己的懒惰找借口,但是本人在园子里也有一 ...
- 实现自己的.NET Core配置Provider之Yaml
YAML是一种更适合人阅读的文件格式,很多大型的项目像Ruby on Rails都选择YAML作为配置文件的格式.如果项目的配置很少,用JSON或YAML没有多大差别.看看rails项目中的配置文件, ...
- 【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- jq-fadeIn&fadeOut
jq-fadeIn&fadeOut: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- html标签及用法小结
html标签小结 这几天学习了html,才发现各种标签真是多的不行,所以打算把一些个常用的标签拿出来稍微说一下. *** 常用基础标签 大体上分了三类: 带有语义的标签 带有一定样式的标签(此类标签页 ...
- Web自动化之Headless Chrome概览
Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...
- Apollo框架试玩
2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...