• iOS滤镜实现之LOMO(美图秀秀经典LOMO)


      LOMO追求鲜艳色彩,随意、自由的态度,是一种经常使用的滤镜,今天介绍一下iOS 中LOMO滤镜的实现

    首先它有3张输入图像

    1.我们要处理的图像。即我们要应用LOMO滤镜的图像

    2      

    3

    在gpuimage中多张输入图像的滤镜需要自己写。在这里我参照本身提供的GPUImageTwoInputFilter,自己写了GPUImageThreeInputFilter,用于接收3张输入图像的滤镜。它们都是通过滤镜组的继承来实现,多重滤镜。

      

      片段着色器

    NSString *const kFWLomofiShaderString = SHADER_STRING
    (
     precision lowp float;
     
     varying highp vec2 textureCoordinate;
     
     uniform sampler2D inputImageTexture;
     uniform sampler2D inputImageTexture2;
     uniform sampler2D inputImageTexture3;
     
     void main()
     {
         
         vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb;//获取要处理图像的rgb值向量
         
         vec2 red = vec2(texel.r, 0.16666);
         vec2 green = vec2(texel.g, 0.5);
         vec2 blue = vec2(texel.b, 0.83333);//使要处理的图像和柔光混合,生成新的像素
         
         texel.rgb = vec3(
                          texture2D(inputImageTexture2, red).r,
                          texture2D(inputImageTexture2, green).g,
                          texture2D(inputImageTexture2, blue).b);
    //前面生成新的像素再与第二个输入图像的像素进行混合
         //使用第三个图像作为暗角模板与前面的像素混合
         vec2 tc = (2.0 * textureCoordinate) - 1.0;
         float d = dot(tc, tc);
         vec2 lookup = vec2(d, texel.r);
         texel.r = texture2D(inputImageTexture3, lookup).r;
         lookup.y = texel.g;
         texel.g = texture2D(inputImageTexture3, lookup).g;
         lookup.y = texel.b;
         texel.b    = texture2D(inputImageTexture3, lookup).b;
    //生成最终的LOMO效果
    gl_FragColor = vec4(texel,1.0); } );
    @implementation FWLomofiFilter
    
    - (id)init
    {
        if (!(self = [super init]))
        {
            return nil;
        }
        
        FWFilter6 *filter = [[FWFilter6 alloc] init];
        [self addFilter:filter];
    //设置第二个输入图像
        UIImage *image = [UIImage imageNamed:@"lomoMap"];
        imageSource1 = [[GPUImagePicture alloc] initWithImage:image];
        [imageSource1 addTarget:filter atTextureLocation:1];
        [imageSource1 processImage];
    //设置第三个输入图像
    UIImage *image1 = [UIImage imageNamed:@"vignetteMap"]; imageSource2 = [[GPUImagePicture alloc] initWithImage:image1]; [imageSource2 addTarget:filter atTextureLocation:2]; [imageSource2 processImage]; self.initialFilters = [NSArray arrayWithObjects:filter, nil]; self.terminalFilter = filter; return self; }

    + (UIImage *)applyLomofiFilter:(UIImage *)image

    {

        FWLomofiFilter *filter = [[FWLomofiFilter alloc] init];

        [filter forceProcessingAtSize:image.size];

    //第一个输入图像

       GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];

        [pic addTarget:filter];

        

        [pic processImage];

        [filter useNextFrameForImageCapture];

    //得到效果图

        return [filter imageFromCurrentFramebuffer];

    }

    原图

     

    lomo效果图

     

     完整代码可以在本人的GITHUB上下载源码!

    下面是废话

    不善言辞的人进博客园首页就这么难,我得写多少废话才能进?这篇可以吗? 不管文字多少,你上网查查ios实现LOMO滤镜的源码,本滤镜纯自己琢磨,在上一代GPUImage中我通过1个多月的摸索,将多图像滤镜实现的。

  • 相关阅读:
    菜根谭#250
    菜根谭#249
    菜根谭#248
    [转载]将网卡(设备中断)绑定到特定CPU
    request_mem_region,ioremap 和phys_to_virt()
    [转载]python的range()函数用法
    [转载]Python print函数用法,print 格式化输出
    [转载]python datetime处理时间
    Linux驱动
    Linux驱动
  • 原文地址:https://www.cnblogs.com/salam/p/5928507.html
Copyright © 2020-2023  润新知