魔扣论坛

魔扣源码论坛业务
查看: 99|回复: 5

美狐滤镜sdk技术(一):所谓的滤镜算法如何实现

[复制链接]
  • TA的每日心情

    昨天 15:14
  • 签到天数: 35 天

    [LV.5]经常留意

    35

    主题

    39

    帖子

    198

    积分

    初级魔扣

    Rank: 2

    魔扣币
    359
    贡献
    145
    威望
    0
    发表于 2019-8-27 15:52:55 | 显示全部楼层 |阅读模式
    魔扣币兑换比例:【 50以下 : ¥1 = 10 魔扣币 】丨【 50 - 100 :¥1 = 20 魔扣币】丨【 100以上:¥1 = 30 魔扣币 】
    淘宝、天猫优惠券

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    滤镜sdk适用的场景有很多,比较常见的有直播、短视频、社交软件、美颜相机等,而随着时代的不断变化,现代人对照片视频的色彩和质感方面的要求也越来越高。本文以滤镜算法为主要内容来简单分享下。
    灰度滤镜
    常见的彩色图片有RGB_8888、RGB_565、RGB_4444几种,每一个像素的颜色值由红、绿、蓝三种值混合而成,红绿蓝的取值也有很多种,而像素的颜色值也有很多颜色值,这可以看作彩色图片的原理。相反的,灰度图片只有356中颜色,通常处理过程中是将图片颜色值的RGB三个通道值设定一样的,这样一来原本是256x256x256种颜色就只剩下256种,而256中颜色值就相当于是丢失了图片的彩色信息,只剩下了亮度值,从人类的视觉上看就是灰色。
    在美狐滤镜sdk中,灰度处理通常有三种算法:
    1.最大值——即新的颜色值R=G=B=Max(R,G,B),该方法处理后的图片或视频亮度较高。
    2.平均值——即新的颜色值R=G=B=(R+G+B)/3,处理后的图片较柔和。
    3.加权平均值——即新的颜色值R=G=B=(RxWr+GxWg+BxWb),由于人眼对不同颜色的敏感度不同,所以三种颜色值的权重也就不同。通常是绿色最高、红色第二、蓝色最低。
    for(var i = 0; i <data.length; i+=4) {
         var grey = (data + data[i+1] +data[i+2]) / 3;
         data = data[i+1] = data[i+2] = grey;
    }
    (本段代码仅供参考,不作商用)
    黑白滤镜
    其实黑白和灰度还是有一定区别的,灰度有256种颜色,而黑白是只保留黑白两种颜色。
    可以计算RGB的平均值arg,arg>=100,R=G=B=255,否则均为0
    for(var i = 0; i <data.length; i += 4) {
         var avg = (data + data[i+1] +data[i+2]) / 3;
         data = data[i+1] = data[i+2] = avg>= 100 ? 255 : 0;
    }
    (本段代码仅供参考,不作商用)
    底片(反向)滤镜
    即将当前像素点的RGB值分别于255之差后的值作为当前点的RGB值,则R=255-R;G=255-G;B=255-B。
    for(var i = 0; i <data.length; i+= 4) {
          data = 255 - data;
          data[i + 1] = 255 - data[i + 1];
          data[i + 2] = 255 - data[i + 2];
    }
    (本段代码仅供参考,不作商用)
    浮雕滤镜
    相比前面几种滤镜算法,浮雕滤镜的算法实现相对比较复杂,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB 值。因为图片中相邻点的颜色值是比较接近的,所以在做算法处理之后只有颜色的边沿区域,即相邻颜色差异较大的部分结果会稍微明显一些,其他平滑区域值一般在128左右,从而实现浮雕效果。
    int preColor = 0;
    int prepreColor = 0;
    preColor = cbuf[0];
    int i = 0;
    int j = 0;
    for (i = 0; i <width; i++)
    {
          for (j = 0; j < height; j++)
          {
               int curr_color = cbuf[j * width + i];
               int r = red(curr_color) - red(prepreColor) + 128;
               int g = green(curr_color) - red(prepreColor) + 128;
               int b = green(curr_color) - blue(prepreColor) + 128;
               int a = alpha(curr_color);
               int newcolor = (int)(r * 0.3 + g * 0.59 + b * 0.11);
               int modif_color = ARGB(a, newcolor, newcolor, newcolor);
               rbuf[j * width + i] = modif_color;
               prepreColor = preColor;
               preColor = curr_color;
          }
    }
    (本段代码仅供参考,不作商用)
    褐色滤镜
    对颜色进行变换的滤镜,在此就不多作赘述。采用公式:R=Rx0.393+Gx0.7 69+Bx0.189;G=Rx0.349+Gx0.686+Bx0.168;B=Rx0.272+Gx0.534+Bx0.131。
    for (var i = 0; i <imgData.height * imgData.width; i++) {
        var r = imgData.data[i * 4],
            g = imgData.data[i * 4 + 1],
            b = imgData.data[i * 4 + 2];
        var newR = r * 0.393 + g * 0.769 + b *0.189;
        var newG = r * 0.349 + g * 0.686 + b *0.168;
        var newB = r * 0.272 + g * 0.534 + b * 0.131;
        var rgbArr = [newR, newG, newB];
        [imgData.data[i * 4], imgData.data[i * 4 +1], imgData.data[i * 4 + 2]] = rgbArr;
    }
    (本段代码仅供参考,不作商用)
    由此可见,美狐滤镜sdk在算法实现方面是存在一定技巧的,但是站在个人开发的角度来看,仍然具备较大困难,并不建议个人研发。
    声明:以上内容均为作者本人原创,转载需注明作者及原文链接,欢迎转载分享。

    该用户从未签到

    2

    主题

    187

    帖子

    372

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    185
    贡献
    185
    威望
    0
    发表于 2019-8-27 15:58:05 来自手机 | 显示全部楼层
    为了三千积分!

    点评

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈  详情 回复 发表于 2019-8-27 16:28
  • TA的每日心情

    昨天 15:14
  • 签到天数: 35 天

    [LV.5]经常留意

    35

    主题

    39

    帖子

    198

    积分

    初级魔扣

    Rank: 2

    魔扣币
    359
    贡献
    145
    威望
    0
     楼主| 发表于 2019-8-27 16:28:35 | 显示全部楼层

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

    该用户从未签到

    3

    主题

    194

    帖子

    385

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    191
    贡献
    191
    威望
    0
    发表于 2019-9-2 12:48:42 | 显示全部楼层
    博海踏浪,书写神奇的友谊,网络之缘让我认识了你,你是我生命中最美的相遇!你是我魔扣源码论坛知心的朋友,你是我可遇不可求的知己!神奇的网络把我们的心紧紧地凝聚在一起,没有了天南海北的距离,没有了从前的相隔万里!我们就像近在咫尺,你的家园我愿前去,我的小屋你常常点击,共同的语言让我们彼此相知,共建浪漫家园的美好夙愿,让我们紧紧拥抱着这一片神奇的网络土地!一次次的耕耘,一次次的收获,我们定会得到一次次的惊喜!愿朋友开心快乐每一天!

    该用户从未签到

    0

    主题

    192

    帖子

    384

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    192
    贡献
    192
    威望
    0
    发表于 2019-9-4 14:53:25 来自手机 | 显示全部楼层
    人生就像是一次浪漫的旅游,每一站都会和不同的人擦肩,有的渐行渐远、有的从此结缘,我珍惜每一个有“缘”能结识的好友,忙碌的时候、魔扣源码论坛也没能忘记你曾带给我的每一份情谊。

    该用户从未签到

    1

    主题

    210

    帖子

    420

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    209
    贡献
    209
    威望
    1
    发表于 前天 21:18 | 显示全部楼层
    欢迎你,亲爱的朋友,看到你的留言让我十分高兴。记得从我们第一次接触以后开始互访,至今已经有5个多月了,在这段时间里,我们从陌生到相识相知,增进了彼此信任,友谊不断加深,直到现在成为好朋友,这都是前世修来的缘分。魔扣源码论坛让我们珍惜这份缘,我相信我们的友谊将永存!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 联系我们
    • 新浪微博 :
    • 在线客服 :魔扣科技 
    • 源码QQ群 :魔扣源码论坛官方总群
    • 联系邮箱 :charlin#morko.net
    • 微信扫一扫
    快速回复 返回顶部 返回列表