参考自: 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:

  1. varying highp vec2 textureCoordinate;
  2.  
  3. uniform sampler2D inputImageTexture;
  4. uniform highp float redAdjustment;
  5. uniform highp float greenAdjustment;
  6. uniform highp float blueAdjustment;
  7.  
  8. void main()
  9. {
  10. highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
  11.  
  12. gl_FragColor = vec4(textureColor.r * redAdjustment, textureColor.g * greenAdjustment, textureColor.b * blueAdjustment, textureColor.a);
  13. }

简单解释一下以上Shader.

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

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

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

  1. #ifndef ClampToByte
  2. #define ClampToByte(v)(((unsigned) int(v)) < (255) ? (v) : (v < 0) ? int(0) : int(255))
  3. #endif
  4.  
  5. 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)
  6. {
  7. int Channels = Stride / Width;
  8. ) return;
  9. int numberOfPixels = Width*Height;
  10. unsigned char* scanLineIn = Input;
  11. unsigned char* scanLineOut = Output;
  12. ; pixel < numberOfPixels; pixel++) {
  13. scanLineOut[] = ClampToByte(scanLineIn[] * redAdjustment);
  14. scanLineOut[] = ClampToByte(scanLineIn[] * greenAdjustment);
  15. scanLineOut[] = ClampToByte(scanLineIn[] * blueAdjustment);
  16. scanLineIn += Channels;
  17. scanLineOut += Channels;
  18. }
  19. }

转换后可进行建表优化。

即:

  1. 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)
  2. {
  3. int Channels = Stride / Width;
  4. ) return;
  5. unsigned ] = { };
  6. unsigned ] = { };
  7. unsigned ] = { };
  8. ; pixel < ; pixel++)
  9. {
  10. AdjustMapR[pixel] = pixel*redAdjustment;
  11. AdjustMapG[pixel] = pixel*greenAdjustment;
  12. AdjustMapB[pixel] = pixel*blueAdjustment;
  13. }
  14. ; Y < Height; Y++)
  15. {
  16. unsigned char* scanLineOut = Output + (Y * Stride);
  17. unsigned char* scanLineIn = Input + (Y * Stride);
  18. ; X < Width; X++)
  19. {
  20. scanLineOut[] = AdjustMapR[scanLineIn[]];
  21. scanLineOut[] = AdjustMapG[scanLineIn[]];
  22. scanLineOut[] = AdjustMapB[scanLineIn[]];
  23. scanLineIn += Channels;
  24. scanLineOut += Channels;
  25. }
  26. }
  27. }

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

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

CPUImageRGBFilter 实现的更多相关文章

  1. cpuimage 开源之

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

随机推荐

  1. 当mysql遇上PHP

    博客提纲 利用PHP连接mySQL数据库 两套接口:面向对象和面向过程 实现写改删查(CUBD)实例 通过prepare语句处理相同类型的不同SQL语句 通过bind_param()绑定参数,及相关注 ...

  2. PHP+MySql实现后台数据的读取

      我们使用的是PHP 的php_mysqli扩展   首先了解一些基础的用法  1.连接数据库使用 mysqli_connect()  参数:①主机地址 ②MYSQL用户名 ③MYSQL密码 ④选择 ...

  3. ecshop的aes加密(封装)

    从一家做shopex,ecstore的公司到一家做b2b的ecshop的公司...来了就要实战,其他的不说了,先来了解什么是php的aes加密吧? aes(高级加密标准),AES的区块长度固定为128 ...

  4. 2017-06-22初识python

    初识python #!/usr/bin/env python (python解释器的文件路径)# -*- coding:utf-8 -*- (使用的编码内型)# python 2.7 <需要加第 ...

  5. 无法将类型为excel.applicationclass的com 强制转换为接口类型的解决方法[转]

    c#解决方案EXCEL 导出 今天碰到客户的电脑在导出EXCEL的时候提示,无法将类型为 excel.applicationclass 的 com 强制转换为接口类型 excel._applicati ...

  6. 如何使用slice,substr代替substring(原创)

    //写这个是为了加深对substring和slice的理解 substring: 任何一个参数小于0,都会被替换成0.两个参数,最小值会被当做start,最大值当做end. 参数 描述 start 必 ...

  7. Vijos 1025 小飞侠的游园方案 0-1背包

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  8. powershell 统计AD中所有计算机及对应的操作系统信息

    要想用powershell管理域,首先先加载activedirectory模块 PS C:\> import-module activedirectory 下面就可以利用get-adcomput ...

  9. Unity3D-Shader-实现X光效果

    [旧博客转移 - 2016年1月3日 16:40 ] 最近学习了一些Shader效果,打算把学到的知识总结一下,这篇讲一下这种轮廓发光的效果(如下图所示),也有一些地方管这个叫X光     1.原理 ...

  10. DotNetCore跨平台~服务总线_事件总线的重新设计

    理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...