Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用 RenderScript实现抖音的黑金效果

如何使用 RenderScript实现抖音的黑金效果

作者头像
xiangzhihong
发布于 2022-11-30 08:06:38
发布于 2022-11-30 08:06:38
97700
代码可运行
举报
文章被收录于专栏:向治洪向治洪
运行总次数:0
代码可运行

最近,有人问我一个问题,如何使用彩图转为黑白,又如何将黑白图片转换为彩图?对于这个问题,我能想到的最直接的方法是:调用Android的系统Api获取图片生成bitmap文件,然后再使用Android中的二值化技术即可实现;除此之外,还可以使用FFpeg等库的方式实现。不过,我们今天要讲的是另外一种方案,即使用RenderScript方式。

一、RenderScript简介

RenderScript 是用于在 Android 上以高性能运行计算密集型任务的框架。RenderScript 专为数据并行计算而设计,不过串行工作负载也可以从中受益。RenderScript 运行时可以并行安排设备上可用的多个处理器(如多核 CPU 和 GPU)上的工作负载,使开发者能够专注于表达算法而不是调度工作。RenderScript 对于专注于图像处理、计算摄影或计算机视觉的应用来说尤其有用。

RenderScript使用的是一种类似于C/C++的rs 脚本语法,且是在运行时编译、跨平台的。性能比 Java 好,比 Native 略差。下图是RenderScript在Android 8.0 及更高版本的设备上的一个框架示意图。

与 Android 7.x 及更低版本中的 RenderScript 之间的区别如下:

  • 一个进程中有两组 RenderScript 内部库的实例。一组用于 CPU 备用路径,直接来源于 /system/lib;另一组用于 GPU 路径,来源于 /system/lib/vndk-sp。
  • /system/lib 中的 RS 内部库是作为平台的一部分构建的,会随着 system.img 的升级而更新。不过,/system/lib/vndk-sp 中的库是面向供应商构建的,不会随着 system.img 的升级而更新(虽然可以针对安全修复程序进行更新,但其 ABI 仍然保持不变)。
  • 供应商代码(RS HAL、RS 驱动程序和 bcc plugin)与位于 /system/lib/vndk-sp 的 RenderScript 内部库相关联。它们无法与 /system/lib 中的库相关联,因为该目录中的库是面向平台构建的,可能与供应商代码不兼容(即,符号可能会被移除)。如此一来可能会导致仅针对框架的 OTA 无法实现。

关于RenderScript的说明,可以参考RenderScript架构组成

二、RenderScript使用

RenderScript的使用分为两个步骤:

  1. 编写 .rs 内核脚本文件;
  2. 使用编写的文件进行渲染方面的处理;

2.1 编写内核脚本文件

RenderScript 内核通常位于 <project_root>/src/ 目录下,由类C语言的.rs语法编写,每个.rs 文件就是一个脚本,每个脚本由一组内核、函数和变量构成。首先,创建一个rs脚本文件代码。 在这里插入图片描述

然后,打开 app 的 build.gradle 文件,在 android 的 defaultConfig 结点添加两句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
renderscriptTargetApi 18
renderscriptSupportModeEnabled true

接下来,下面以【将图片置灰】为例来说明如何编写内核脚本文件,新建一个 Gray.rs 文件,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma version(1)
#pragma rs java_package_name(com.avatar.rs)

void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    // a 是透明度,这里不修改透明度。
    out->a = in->a;

    // 快,但并不是真正意义的去色
    out->r = out->g = out->b = (in->r + in->g + in->b) / 3;

    // 慢,但是是真正的去色
    // out->r = out->g = out->b = (in->r * 299 + in->g * 587 + in->b * 114 + 500) / 1000;
}

void init() {
}

其中,第1行声明 RenderScript 的版本;第2行是申明该脚本所在的Java包的包名;root 函数是脚本文件的入口函数,对于图片来说,root函数负责对每一个像素做处理。参数 in 是输入像素点的指针; out 是输出像素点的指针。并且,init 函数是可选的,主要用于做一些初始化的工作。

2.2 调用rs脚步文件

使用前,需要先引入RenderScript脚本文件,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.avatar.rs.ScriptC_greyscale;

这里的类名是 ScriptC_ 加上 .rs 的文件名,包名就是在创建 rs 文件时声明的包名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.avatar.rs.ScriptC_greyscale;

public class MainActivity extends AppCompatActivity {

    private ImageView mImageView;
    private ImageView mRSImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageView =  findViewById(R.id.image_view);
        mRSImageView =  findViewById(R.id.rs_image_view);

        Bitmap mInBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test);
        Bitmap  mOutBitmap = Bitmap.createBitmap(mInBitmap.getWidth(), mInBitmap.getHeight(), mInBitmap.getConfig());
        mImageView.setImageBitmap(mInBitmap);

        Bitmap bitmap=transGray(this,mInBitmap);
        mRSImageView.setImageBitmap(bitmap);
    }


    public static Bitmap transGray(@NonNull Context context, @NonNull Bitmap bitmap) {
        // 创建输出 bitmap
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        // 创建 RenderScript 对象
        RenderScript rs = RenderScript.create(context);
        // 创建输入、输出 Allocation
        Allocation allIn  = Allocation.createFromBitmap(rs, bitmap);
        Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
        // 创建我们在上面定义的 script
        ScriptC_greyscale script = new ScriptC_greyscale(rs);
        // 对每一个像素执行 root 方法
        script.forEach_root(allIn, allOut);
        // 将执行结果复制到输出 bitmap 上
        // 释放资源
        rs.destroy();
        return outBitmap;
    }
}

然后,我们运行下代码,看看前后的对比效果。

2.3 多函数调用

除了 root 函数,我们还可以在 .rs 中定义其他的 kernal 函数,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 
 * 黑金色转换
 */
uchar4 __attribute__((kernel)) blackGold(uchar4 in, uint32_t x, uint32_t y) {
    uchar4 out = in;

    if ((in.r < in.b) && (in.g < in.b)) {
        out.r = out.g = out.b = (in.r*299 + in.g*587 + in.b*114 + 500) / 1000;
    }

    return out;
}


uchar4 __attribute__((kernel)) root(uchar4 v_in) {
    float4 f4 = rsUnpackColor8888(v_in);

    float3 mono = dot(f4.rgb, gMonoMult);
    return rsPackColorTo8888(mono);
}

uchar __attribute__((kernel)) toU8(uchar4 v_in) {
    float4 f4 = convert_float4(v_in);
    return (uchar)dot(f4.rgb, gMonoMult);
}

uchar4 __attribute__((kernel)) toU8_4(uchar v_in) {
    return (uchar4)v_in;
}

在定义kernal 函数时,函数返回值必须是 uchar4, 并且用 __attribute__((kernel)) 标记该函数是个 kernal 函数。然后,我们在Java代码中就可以使用下面的方式进行调用了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
script.forEach_blackGold(allIn, allOut);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据下的新离婚时代,拿什么衡量其情感忠诚度?
在恋人眼中,证据确凿的出轨无疑是让人心碎的。对于生活在21世纪的这一代人来说,想要发现恋人出轨的证据,显然并不困难,捉奸的科技成本变得十分低廉。
IT阅读排行榜
2018/08/15
3770
大数据揭另类爱情报告:每4对新婚有1对离婚
据经济之声报道,《2013-2014年中国男女婚恋观调查报告》正式发布,报告由婚恋网站世纪佳缘发起,通过72660份有效数据样本,对2013年的婚恋热点进行系统梳理和全景扫描,对当代中国男女的婚恋观念
小莹莹
2018/04/20
9450
大数据揭另类爱情报告:每4对新婚有1对离婚
大数据告诉你爱情的残酷真相
信息专家分析了成千上万条可怕又令人心碎的分手数据后,发现人们其实可以预测到恋人的关系可能会以什么方式来结束。 先来看则好消息:每天约有300万情侣开始首次约会,这是300万次让各位将萍水相逢变为人生乐事的机会,是300万次火花的迸发,是300万次人与人沟通的良缘。同时,在美国这个总人口中5.4%的人到死都没结过婚的国度里,这个数字又表明有300万人将认识生命中可能不会与之共度余生的那个人。 比起恋爱来说,婚姻中的迷茫更为常见。相爱到婚姻是幸福,那么反面就是相爱然后分手。 信息专家大卫·麦克坎德莱斯(Davi
小莹莹
2018/04/18
1.3K0
大数据告诉你爱情的残酷真相
【案例】大数据告诉你爱情与婚姻的残酷真相
信息专家分析了成千上万条可怕又令人心碎的分手数据后,发现人们其实可以预测到恋人的关系可能会以什么方式来结束。   先来看则好消息:每天约有300万情侣开始首次约会,这是300万次让各位将萍水相逢变为人生乐事的机会,是300万次火花的迸发,是300万 次人与人沟通的良缘。同时,在美国这个总人口中5.4%的人到死都没结过婚的国度里,这个数字又表明有300万人将认识生命中可能不会与之共度余生的那个人。   比起恋爱来说,婚姻中的迷茫更为常见。相爱到婚姻是幸福,那么反面就是相爱然后分手。   信息专家大卫·麦克坎德
小莹莹
2018/04/20
9420
【案例】大数据告诉你爱情与婚姻的残酷真相
打算一个人过一辈子,该准备些什么?
这几天一则新闻将单身狗又虐了一次: 国家民政局数据显示,中国单身男女人数已近2亿,主动选择单身的“单女”明显增多,独居人口从1990年的6%上升到2013年的14.6%,如今有超过5800万人一个人生活。 这坚定了单身狗的信心:原来战壕里竟然有2亿战友。 专家表示中国第四次单身潮正在来临,前三次单身潮分别是:新中国成立之后《婚姻法》颁布允许离婚;『文革』结束之后上山下乡青年返城;1980年《婚姻法》修改,“感情破裂”可作为离婚理由。 第四波单身潮属于80后、90后。这一波单身潮很大部分原因是观念改变,而不
罗超频道
2018/04/28
1.3K0
打算一个人过一辈子,该准备些什么?
【大数据】用数据分析告诉你爱情的残酷真相
导读   信息专家分析了成千上万条可怕又令人心碎的分手数据后,发现人们其实可以预测到恋人的关系可能会以什么方式来结束。   先来看则好消息:每天约有300万情侣开始首次约会,这是300万次让各位将萍水
小莹莹
2018/04/20
2.7K0
【大数据】用数据分析告诉你爱情的残酷真相
【聚焦】从李亚鹏谢顶说起, 用大数据谈失败婚姻对人的打击
编者按 王菲的前夫李亚鹏日前被人发现“后脑勺头发稀疏”,有网友点名王菲男友谢霆锋要小心,因为“有一种王菲的前男人叫秃头”,前夫窦唯和李亚鹏都中奖了。 但你们先别急着嘲笑李亚鹏,让大数据告诉你婚姻失败对人打击有多大!稳定的婚姻,对于社会来说无疑是个好事,对于人的身体健康呢? 来源:他们说 早在1858年,法国的流行病学家威廉·法尔就研究过婚姻对健康的影响。他将成年人群分为“已婚”、“单身”和“丧偶”三类。结合死亡率、年龄及其他因素分析后,他发现,单身人群的疾病死亡率是比已婚者高出许多的,而丧偶
小莹莹
2018/04/23
7070
【聚焦】从李亚鹏谢顶说起, 用大数据谈失败婚姻对人的打击
七夕情人节,看 ---大数据时代里的爱情!
从前,在西雅图的一家Pony Expresso咖啡店里,一个男人与一个女人开始了对这个绵长而又神秘的事物的体验,这个事物已得到了愈来愈多科学研究,而我们称其为爱情。最初的阶段被称为“盲目的热恋”。这是种让人兴奋纠结,眼神一刻亦不能离开的感觉,这个时候在你的渴望势力面前,仿佛世界停止了转动,时间俯首停顿。这个男性,当时44岁的华盛顿大学心理研究学家约翰·戈特曼(John Gottman),被这个女人异常浓密的黑色卷发和她的创造力所吸引:她是一个业余的音乐家和画家,且和他一样,她也是个心理学家。这个女性,当
小莹莹
2018/04/23
9460
七夕情人节,看 ---大数据时代里的爱情!
大数据时代的未来婚恋——你骗不了你的过往
最近与相恋四年的女友间歇性吵架,作为心智不全的低龄表现,我赌气性地上了某婚恋网站。然而,当我真正点开网页,看到如无痛人流广告一般的页面设计(那种最烂俗的粉),以及满屏幕冲我傻笑的头像,脑中回荡一种声音:嘿,关了吧,这不是正经人待的地儿。 这当然不是婚恋网站的错,只是有悖我心中对“寻觅知己”的优雅想象。诚恳地说,我无心在海量异性资料中疲于搜索——尤其当这些资料大多为“吃货”“宅”“旅行”“读书”“电影”“有魄力”“开朗”……若你像我一样,认为恋人之间尽可能的彼此了解是同住一屋檐的基石,又不太相信“平凡是唯一答
CDA数据分析师
2018/02/23
5980
国民阅读大数据:单身是年轻人新常态
近日,一点资讯发布了《2016年国民阅读足迹大数据报告》,并被中央电视台财经频道《中国经济生活大调查》节目作为重要数据参考。与此同时,一点资讯也深度参与了央视调查,为其提供多个维度的数据支持。 据悉,大数据报告基于海量用户点击、搜索、订阅、评论等阅读行为,从地域、时间、情感、大事件等多个维度洞悉国民阅读行为轨迹。 报告数据显示,二孩儿、情感、离婚、恋爱、出轨、雾霾、人工智能等热门话题均成为2016年度关键词;心理健康、减肥、育儿、恋爱、明星时尚等话题则登上2016年度订阅量最高频道TOP20榜单。 同时,
灯塔大数据
2018/04/08
5950
国民阅读大数据:单身是年轻人新常态
2015上半年十大经典新媒体营销案例
忙忙叨叨的2015年已经过半,各类热点都被营销得色香俱佳,赶紧看看吧,谁知道很快还会来些啥 微信春晚抢红包 点评:地上掉了一块钱你忽略 红包里的每分钱你却不放过 春节微信摇红包算是改变了人们看春晚
小莹莹
2018/04/20
8860
2015上半年十大经典新媒体营销案例
【吐槽】大数据择偶 让你脑洞大开
女博士嫁不出去么,姐弟念不会长久,恋爱多久了在一起生活?就让大数据带你走进互联网时代的择偶指南!上海市复旦大学社会科学数据研究中心在本市找了80个社区、3311个家庭,花了半年时间入户一对一答题。最后分析总结出了下面这样一份堪称专业、科学、高效的择偶指南! 1、找对象钱和长相都不重要……你确定?   人们对男女对象的标准最注重的三个条件均是:生活习惯、性格和智商。如果智商有硬伤,那就尝试从生活习惯和性格上让自己变得更好吧,如果都有硬伤……那神也帮不了你。   但是怎么隐隐觉得哪里不对…
小莹莹
2018/04/23
6290
【吐槽】大数据择偶 让你脑洞大开
什么人最适合与你结婚?别信星座,看大数据!
姐弟恋靠不靠谱?女博士能嫁出去不?恋爱多久开始同居?来看看大数据,一定让你脑洞大开! 复旦大学社会科学数据研究中心在上海市范围内找了80个社区、3311个家庭,花了半年时间入户一对一答题。最后分析总结
小莹莹
2018/04/18
6040
什么人最适合与你结婚?别信星座,看大数据!
婚姻大数据:姐弟恋最靠谱,男同学们,小姐姐会好好爱护你的
导读:每个人都会有自己的宿命,在感情上也一样,有些人可能经历过几段婚姻,绕个弯最后找到自己的归宿,而有些人只是一直在寻找的路上。那么你最适合和什么样的人结婚?来看看大数据分析得出的结论!
IT阅读排行榜
2018/12/14
7500
解密幸福婚姻:心理学家+40年研究+3000对情侣数据
心理学家高特曼夫妇给出了肯定的答案。通过40年的情侣和婚姻关系研究,他们收集实验数据并用数学的方法建立模型,预测哪些夫妇不能白头偕老。
IT阅读排行榜
2018/08/15
2.1K0
解密幸福婚姻:心理学家+40年研究+3000对情侣数据
4.3亿人次狂欢 大数据告诉你锋菲恋到底有多火
9月20日,4.3亿人次在微博上八卦狂欢,80%互动网友是女性,话题热度是“王全安嫖娼被抓”的3.4倍,是“姚晨离婚内幕”的2.7倍。有意思的是,随着锋菲复合、张柏芝病倒新闻连番登场,张柏芝获得了不少同情与赞美,口碑劲升,“充满母爱的单亲妈妈”“新时代独立女性”形象再度升华。而网友对“锋菲复合”,则是毁誉参半。 一、4.3亿人次的八卦狂欢 “王全安”“姚晨”“小个子中国首富”成昨日黄花 9月20日,锋菲复合新闻曝出,年度娱圈重磅横空出世。经过10小时发酵,4.3亿人次参与八卦狂欢,或支持或吐
小莹莹
2018/04/20
5590
4.3亿人次狂欢 大数据告诉你锋菲恋到底有多火
大数据来分析下陈赫与老婆许婧离婚对事业会有影响吗?
  调查分析 陈赫离婚引发轩然大波,劈腿传闻沸沸扬扬,各 种腹黑栽赃传说也甚嚣尘上,处于舆论风暴眼的陈赫,“好男人”形象大打折扣,事业是否也受到冲击?去年初,当文章出轨发酵时,文章的事业可谓遭受重创,
小莹莹
2018/04/20
5680
大数据来分析下陈赫与老婆许婧离婚对事业会有影响吗?
大数据告诉你:收入多少才算80后里的top人群?
先啰嗦下背景,以下这些数据来自复旦大学社会科学数据研究中心所发布的“80后的世界——复旦大学长三角社会变迁调查”,以1980-1989年出生的一代人(简称80后)为跟踪主体,研究的内容包括这一代人的家庭、婚姻、就业、迁移、住房、生育、子女教育、父母养老等各个方面。 虽然调查很全面,数据结论也很有意思,但是受限于主要在上海,所以仅供大家参考对标。 今天图文来自多个地方汇总,版式文字整理有混乱的地方请大家多包涵…… ———————————— 结论一:80后“拼爹”很残酷,但 “拼妈”更重要 下图你可以瞧一瞧
小莹莹
2018/04/19
1.3K0
大数据告诉你:收入多少才算80后里的top人群?
大数据:80后年薪多少,才能摆脱中年危机?这是最好的答案
如今,80后已成为职场、家庭、社会的中流砥柱。第一批80后都要38岁,最后一批也满了28岁。在这一代人中,现在月薪多少才算跑赢同龄人的“人生赢家”呢? 早两年,大叔是民国老公级别待遇。魅力大叔吴秀波,秋裤男神李健,师奶杀手张嘉译……互联网上的小姑娘上蹿下跳要嫁给成熟性感的大叔。 两年不到,时过境迁,大叔一夜变成了油腻中年人。啤酒肚、发际线后退、盘手串儿,名人野史如数家珍,睡衣唐装混搭出街,保温杯里泡枸杞……人到中年,不管你贵贱美丑,都被贴上了“油腻”的标签。 而走在奔四路上的80后,成了中年危机的重灾区。
企鹅号小编
2018/02/01
5900
大数据:80后年薪多少,才能摆脱中年危机?这是最好的答案
看数学天才如何利用“大数据”找到真爱
原文地址 http://www.wired.com/2014/01/how-to-hack-okcupid/all/ 男主角麦金利 每个人都试图创建最佳版本的个人资料,只不过他用数学知识来帮助他做到了
智能算法
2018/04/02
8050
看数学天才如何利用“大数据”找到真爱
推荐阅读
相关推荐
大数据下的新离婚时代,拿什么衡量其情感忠诚度?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验