用代码生成Glitch Art风格的抖音字体

2023-11-03

最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体,我也非常喜欢这种风格的字体,于是趁着晚上的时间,动手用代码实现了下此类风格的字体特效,顺便开发了个小工具,地址见文末。本文主要是从 艺术手法JS 前端 实现 2 个方面进行梳理,我们可以看到 如何用代码来描述艺术手法 ,达到 自动化生成某一风格作品 的目的。
我们先了解下抖音的这种 logo 的艺术风格。抖音 logo 这种设计手法,是故障艺术 Glitch Art 中的“ 错位 ”。故障艺术还有 燥波、失真、毛刺 等等其他设计手法。
Glitch 这个词, 常指电脑或硬件设备出小毛病。 著名的美国宇航员 John Glenn 对这种现象的表述为:
"Literally, a glitch is a spike or change in voltage in an electric current."
从字面上看,故障是电流中的尖峰或电压变化。
故障艺术 GlitchArt
作为一种艺术形式,产生于我们生活中一些十分常见的场景,例如数字设备发生故障的场景,当电视、电脑等设备的软件或硬件出现问题后,可能会造成视频音频播放异常,在视觉上,画面变成 破碎 、带有缺陷的图像, 颜色失真 。艺术家们却从这些故障中发现了美,他们认为故障产生的美除了代表不完善之外,更意味着意外和变化, 每一次故障的发生都像是打破常规的一次再创造
看2个案例:
Adidas x 大疆也运用故障艺术效果推出了新款限鞋盒,运动与科技的跨界联姻:
还有动态海报的案例:
艺术家总是能从生活中发现美,从厂房的破旧发觉 破旧之美 ,裸露的钢结构与斑驳的混凝土让人感受到存在的真实感。再如电影中常见的“ 暴力美学 ”,将暴力的动作场面仪式化,要么把影片中的枪战、打斗场面消解为无特定意义的游戏、玩笑;要么把它符号化,作为与影片内容紧密相关的视觉和听觉的审美要素。如下图的电影海报作品采用黄色、黑色、红色,把暴力美学融入海报设计中。
再看电影 《攻壳机动队》 的海报,强烈的 纵向、横向的线条感
有了以上的认知基础,我们从艺术手法上提炼出抖音 logo 及海报字体的手法:
艺术手法1
错位
艺术手法 2
横向线条感
接下来, MixLab 这边教大家用代码实现这一风格,并开发一个 小工具 ,用于以后制作此类字体风格,帮大家节省时间,还可以升级加入 生成 GIF 动图 的功能。我们先分析下抖音的 logo ,这是一个图形, 向左向右偏移左边跟右边的分别赋予2个不同颜色 。如下图所示:
最上面一种实现是比较简单的,只要使用偏移,重叠3个字样就行;下面一种涉及到2个字样的 交集 运算,处理起来也稍复杂,但效果更精细,本文采用的是下面一种实现方式。
一个抖音风格的字体构成是由3部分构成的,分别是 左上青色字样、中间白色字样、右下红色字样 ,我们可以用前端 canvas 实现,先绘制文字内容至画布,然后分别向左上、右下拷贝一份,这里主要应用到了 globalCompositeOperation 属性,各种 globalCompositeOperation 的效果,可以一一试验,尝试效果。
下面开始一步步用代码实现:
技术实现 1
偏移及 xor 操作

1.1

选一款接近抖音风格的字体:
免费商用字体:
站酷酷黑体
http://www.zcool.com.cn/special/zcoolfonts/#3rdPage

1.2

先绘制左上方的字样
 
 
ctx.textBaseline="top"; ctx.font=this.font; ctx.fillStyle=this.colorLeft; ctx.fillText(word,x-offset,y-offset);

1.3

绘制右下的字样
 
 
ctx.globalCompositeOperation="xor"; ctx.fillStyle=this.colorRight; ctx.fillText(word,x+offset,y+offset);

1.4

新建一个 canvas ,绘制背景及中间的字样
 
 
var canvasBg=document.createElement('canvas'), ctxBg=canvasBg.getContext('2d'); canvasBg.width=this.ctx.canvas.width; canvasBg.height=this.ctx.canvas.height; ctxBg.fillStyle=this.colorBg; ctxBg.fillRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height); var word=this.word, offset=this.offset, x=this.x, y=this.y; var ctx=this.ctx; ctxBg.textBaseline="top"; ctxBg.font=this.font; ctxBg.fillStyle=this.color; ctxBg.fillText(word,x+offset,y+offset);

1.5

把第3步的画布绘制到第4步中的背景中
 
 
ctxBg.drawImage(ctx.canvas,0,0);
技术实现 2
sin 函数 ,getImageData putImageData 像素级处理

2.1

分别计算出切割字样片段的方框坐标、高度
主要是使用 sin 函数,随机计算出一些高度值,映射到字样的高度中进行切割,这边默认设置成切割成10段。代码见 DYText.prototype.generate 的 get 部分。

2.2

为实现横向的线条感,需计算风格化后的坐标位置。
这里由于篇幅所限,详细可以在知识星球咨询。代码见 DYText.prototype.generate 的 put 部分。
至此,我们写了个 JS 库,用于自动生成抖音风格的字样。除了生成 png 图,我们也可以继续拓展功能,这边选择了开源库:
http://jnordberg.github.io/gif.js/
在前端利用 web workers 生成 GIF ,生成速度还不错。代码如下:
 
 
var gif = new GIF({ workers: 20, quality: 10, workerScript:'./js/gif.worker.js' }); var frames=this.createFrames(); for (let index = 0; index < frames.length; index++) { gif.addFrame(frames[index], {delay:200}) }; gif.on('finished', function(blob) { cb(URL.createObjectURL(blob)); }); gif.render();
其中 createFrames 是 DYText.prototype.createFrames ,用于生成不同状态下的字体,并存为一个canvas ,保存到一个 frames 数组里。
cb ( URL.createObjectURL ( blob ) ) 是一个回调函数,因为 GIF 的生成是异步的,所以使用回调函数 cb 把生成的 base64 传出来,写到一个 img 标签的 src 即可显示。
一个错位、横向线条感的字体风格生成器的 JS 库 就完成了,后面可以自行添加 UI 界面,或者扩展 JS 库。我们总结下主要使用的艺术手法,错位及横向线条感,通过偏移、xor 操作、sin 函数、getImageData 及 putImageData 像素级处理等技术手段,实现了自动创作的功能。我们可以看到, 从艺术手法到技术实现的过程,艺术可以被算法清晰地描述,反过来使用算法生成艺术作品也是成立的
错位
x
偏移及 xor 操作
横向线条感
x
sin ,getImageData putImageData
以上为全文内容。最近我在思考把文章当成产品来打磨,定了个小基调: 一篇文章尽量涉及2个不同领域的内容,跨界思考之间的关联性 。欢迎读者在微信群交流,入群方式留言获取。
热门文章推荐:
TensorFlow.js、迁移学习与AI产品创新之道​mp.weixin.qq.com
关于【科技中的设计师】,这可能是最走心的一篇文章​mp.weixin.qq.com
设计师/产品经理是否需要懂技术?​mp.weixin.qq.com
PC,建议浏览器chrome,体验此工具:
https://shadowcz007.github.io/DYText/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用代码生成Glitch Art风格的抖音字体 的相关文章

  • 毕业设计-深度学习机器视觉的交通标识符识别

    目录 前言 课题背景与意义 课题实现技术思路 图像预处理 提取特征颜色 边缘提取 实现效果 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几

随机推荐

  • Kafka入门系列—1. topic、消费者组等重要概念

    消息队列是生产者向消息队列发送消息 消费者从消息队列拉取 pull 消息 生产者 生产者是消息队列的数据源 可以向其发送消息 如字符串 二进制数据等 消费者 消费者的数据源就是Kafka 于是通过Kafka实现了生产者和消费者两个系统的解耦
  • Anaconda的tensorflow2.0.0突然出现ERROR:root:Internal Python error in the inspect module.

    就是numpy版本的问题 直接卸载numpy版本 pip uninstall numpy 如果卸载的时候报错 把ide关掉比如Jupyter Pycharm Spyder 再下载最新版本的numpy pip install U numpy
  • js 判断数据类型

    如何判断js中的数据类型 typeof instanceof constructor prototype方法比较 如何判断js中的类型呢 先举几个例子 var a iamstring var b 222 var c 1 2 3 var d
  • php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码)

    php实现 密码验证合格程序 复杂问题分类 超简单的 分类 规范编码 一 总结 一句话总结 复杂问题分类 超简单的 分类 规范编码 1 写的时候判断 不能有相同长度超2的子串重复 的时候 子串重复写成隔2位置了 应该是任意的 47 for
  • 01_手写SpringIOC思路

    文章目录 手写Spring之IOC思路整理 手写Spring之IOC思路整理 先说说老生常谈的东西 关于IOC的理解 1 Spring管理对象 IOC就是控制反转 Spring之前 我们都是自己控制对象的 new 用了Spring就是 把整
  • CSS基础语法

    CSS简介 CSS的主要使用场景就是美化网页 布局页面的 HTML的局限性 HTML只关注内容的语义 比如 h1 表明这是一个大标题 p 表明这是一个段落 img 表明这有一张图片 a 表示此处有链接 很早的时候 世界上的网站虽然很多 但是
  • 区块链技术,正面临哪些难题与挑战?

    2018年对区块链来说 是关键的一年 在这一年 区块链出现在了大众视野 成为人工智能之后的下一个科技风口 区块链新技术的来临 正在融入多个领域并催生一批创业公司 从理论上讲 区块链技术的应用范畴 可以涵盖货币 金融 经济 社会的诸多领域 但
  • emqx增加用户认证功能

    1 关闭匿名登录 首先 关闭匿名登录 编辑配置文件 emqx conf 修改为 allow anonymous改为 false 即修改后是 allow anonymous false vim emqx etc emqx conf 操作演示
  • Windows下使用zsh——WSL(Debian)方法

    转载自我的个人博客 建议直接跳转个人博客查看 这个复制过来居然没有图 陈狗说windows下命令行太难用可以换成zsh 根据网上教程 GPT4的提示搞着玩 记录一下过程 我使用了WSL zsh的方法 也可以使用Git Bash zsh 1
  • 超详细超全超好理解的KMP算法

    定义 KMP算法是一种字符串匹配算法 用于在一个主串中查找一个模式串的出现位置 先看这个视频 再看下边的代码实现 油管阿三哥讲KMP查找算法 中英文字幕 人工翻译 简单易懂 https www bilibili com video BV18
  • Qt标准对话框按钮显示中文解决方案(原创)

    从网上搜了一堆解决方法 大多是考来考去 也没有解决我的问题 基本的方法是 在窗口实例化之前 加载和安装QTranslator 加载的qm文件从qt源文件中的ts文件中发布而来 例如 C Qt Qt5 13 0 5 13 0 Src qttr
  • 3D游戏编程作业四

    基本操作演练 首先是去unity商店下载一个skybox的资源包 然后创建一个materia 点击shader选择skybox并选择6sided 然后将相应位置的图片拖进去 点击add component 选择rendering 添加sky
  • VSCODE同步插件以及代码片段

    利用 share code 插件同步代码片段 利用 Settings Sync可以同步 VS code 配置 但它只能同步插件 利用 Settings Sync 再配合 share code 插件可以同步自定义代码片段 可以把 VS cod
  • BatchConfigTool批量配置工具

    海康批量配置工具BatchConfigTool是一款支持设备在线搜索 批量配置参数 批量升级等功能的软件 支持对大批量设备同时进行各参数的配置 极大的简化了操作过程 软件功能 1 对在线设备进行搜索 激活 修改设备的网络参数等 2 批量对设
  • hadoop 运行java 清洗数据 报错Failed to set permissions of path: \tmp\...

    清洗数据写好代码后 运行报错 ERROR org apache hadoop mapred TaskTracker Can not start task tracker because java io IOException Failed
  • 转载的关于 二级制的反码,补码,原码等,筛选过的.

    一 机器数和真值 在学习原码 反码和补码之前 需要先了解机器数和真值的概念 1 机器数 一个数在计算机中的二进制表示形式 叫做这个数的机器数 机器数是带符号的 在计算机用一个数的最高位存放符号 正数为0 负数为1 比如 十进制中的数 3 计
  • 关系数据库范式(1NF,2NF,3NF,BCNF,4NF,5NF)全解析

    1 范式的基本概念 设计关系数据库时 遵从不同的规范要求 设计出合理的关系型数据库 这些不同的规范要求被称为不同的范式 各种范式呈递次规范 越高的范式数据库冗余越小 没有冗余的数据库未必是最好的数据库 有时为了提高运行效率 就必须降低范式标
  • 【VHDL】分频器设计要求:25分频,占空比为50%

    VHDL 分频器设计要求 25分频 占空比为50 程序 LIBRARY IEEE USE IEEE STD LOGIC 1164 all entity DIV 25 IS PORT CLK IN STD LOGIC S1 S2 BUFFER
  • java引入包的关键字_java 包和导包关键字import

    包的概念 相当于 文件夹 person java package com jd public class person 注意该处为public 这样才能被访问 String name int age public person String
  • 用代码生成Glitch Art风格的抖音字体

    最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体 我也非常喜欢这种风格的字体 于是趁着晚上的时间 动手用代码实现了下此类风格的字体特效 顺便开发了个小工具 地址见文末 本文主要是从 艺术手法 和 JS 前端 实现