【发布时间】:2018-06-15 17:53:04
【问题描述】:
我正在尝试为我的应用中的图像开发一些颜色过滤器。我们使用查找图像,因为它们易于用于从其他程序中复制过滤器,并且便于跨平台获得相同的结果。我们的查找看起来像这样
以前,我们使用GPUImage 来过滤查找图像,但我想避免这种依赖,因为它高达 5.4mb,我们只需要这个功能。
搜索了几个小时后,我似乎找不到任何关于如何使用查找图像通过CoreImage 过滤图像槽的资源。但是,查看文档,CIColorMatrix 看起来像是合适的工具。这里的问题是我太笨了,无法理解这是如何工作的。这让我想到了我的问题;
有没有人举例说明如何使用CIColorMatrix 从查找中过滤图像?(或任何关于我应该如何自己解决的指示)
我已经浏览了GPUImages 代码,看起来他们用来从查找图像中过滤的着色器定义如下:
查找图像着色器:
varying vec2 textureCoordinate;
varying vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
// lookup texture uniform float intensity;
void main() {
vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
float blueColor = textureColor.b * 63.0;
vec2 quad1;
quad1.y = floor(floor(blueColor) / 8.0);
quad1.x = floor(blueColor) - (quad1.y * 8.0);
vec2 quad2;
quad2.y = floor(ceil(blueColor) / 8.0);
quad2.x = ceil(blueColor) - (quad2.y * 8.0);
vec2 texPos1;
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
vec2 texPos2;
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
vec4 newColor2 = texture2D(inputImageTexture2, texPos2);
vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity);
}
除了这个顶点着色器:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
attribute vec4 inputTextureCoordinate2;
varying vec2 textureCoordinate;
varying vec2 textureCoordinate2;
void main() {
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
textureCoordinate2 = inputTextureCoordinate2.xy;
}
我可以/应该使用这些着色器创建自己的滤镜吗?
【问题讨论】:
-
GPUImage 受 BSD-3 条款许可。您可以获取所需的库部分并在您的项目中使用。
-
@IvanSmetanin 好点!我尝试通过代码查看(更新的问题),但随着大型库的发展,它非常交织在一起,很难从中获取一些部分。我也宁愿避免使用它们有些专有的语法,因为我是香草和信任的忠实粉丝????图书馆设计。
标签: ios swift core-image