前端图片编辑功能的实践小结

简介: 前端图片编辑功能的实践小结

作者|山渐

微信图片_20211112144408.gif

我们在发布器上提供了图片编辑功能,去支持封面图的编辑,并且统一多端协议,打通素材中心,实现一套协议,多端渲染。



背景


发布器的整体框架解决了业务接入效率的问题,但我们还需要去解决业务效果问题。短视频的发布效果是目前的重点,对比快手、小红书、抖音等一众竞品,可以发现他们的封面图的效果更加丰富。因此,我们在发布器上提供了图片编辑功能,去支持封面图的编辑,并且统一多端协议,打通素材中心,实现一套协议,多端渲染。
和竞品做一样的事情?不!


我们研究了抖音、快手等的封面编辑功能。在体验完之后,感觉他们的功能还是相对单一,基本只有花字、和模板。所以我们提供更丰富的能力,且具有淘宝的特色,能服务好我们的客户。

 竞品分析


下图一抖音、图二快手、图三淘系

能力
抖音
快手
淘系
花字
✔️ ✔️ ✔️
模板 ✖️ ✔️ ✔️
边框 ✖️ ✖️ ✔️
滤镜
✖️ ✖️ ✔️
画笔(笔触)
✖️ ✖️ ✔️
形状
✖️ ✖️ ✔️
点9图
✔️ ✖️ ✔️
实时编辑
✖️ ✔️ ✔️

1.gif

2.gif

3.gif


核心效果:花字


花字的难点在于实现一套协议多端渲染,所以需要充分考虑移动端、PC 端的渲染差异。其次需要考虑如何快速拓展新效果。


难点一:点 9 图


什么是点 9 图?为什么难? 点 9 图是一种特殊的图片样式,可以确保图片拉伸时,所设定的关键部分不变形 移动端系统支持点 9 图渲染,但 PC 端需要实现一套点 9 图渲染引擎


普通图片经由原图拉伸之后,会产生缺角部分的形变。但我们希望的是,边角部分始终不变,这样才符合视觉的需求。所以在这张点 9 图中,两个缺角,其实就是整张图的关键部分。大多数的点 9 图,其实也就是对边角有一些特殊要求。我们通常可以通过 4 个方向的 Padding,来将这些关键部分划分出来。

4.jpg

点9图实现:三个步骤(对应三个 Canvas)


步骤一:裁剪区块 (SourceCanvas 对源图片进行裁剪)

步骤二:区块拉伸 (ScaleCanvas 对某一个区块进行拉伸、平铺)

步骤三:区块拼接 (TargetCanvas 将处理好的区块拼接起来,导出目标尺寸的新图片)

5.jpg

6.jpg

拉伸区块的变形问题


对于一些素材,在上图的 2、4、5...用于拉伸的区块上可能也存在一些图案,所以我们给定一个宽高比,在宽高比之内,做拉伸,到达宽高比之后,将两张原图拼接,并重新拉伸到相应的大小,之后不停的拼接。这种处理方式,可以同时解决相框特效,因为本质上,相框其实就是区块 5 为透明的点 9 图


难点二:定位与线性布局


定位的协议,我们先设定了上、下、左、右、中 5 个方向的二进制值,最后通过位运算得出细分的 9 个点,实现一个9宫格式的定位。而对于线性布局,它原本也是移动端的概念,我们在 PC 端上实现了横纵两种配置。

/*定位协议*/
上:00001 (二进制)
左:00010
下:00100
右:01000
中:10000
// 设置好上述五个方向的值之后,对每个方向互相做或运算。
如:
   00001
|  00010
---------
   00011
上左 = 上|左 = 00001 | 00010 = 00011 (十进制:3)
上中 = 上|中 = 00001 | 10000 = 10001 (十进制:17)
上右 = 上|右 = 00001 | 01000 = 01001 (十进制:9)
左中 = 左|中 = 00010 | 10000 = 10010 (十进制:18)
中 = 10000                          (十进制:16)
右中 = 右|中 = 01000 | 10000 = 11000 (十进制:24)
下左 = 下|左 = 00100 | 00010 = 00110 (十进制:6)
下中 = 下|中 = 00100 | 10000 = 10100 (十进制:20)
下右 = 下|右 = 00100 | 01000 = 01100 (十进制:12)

7.gif

怎么实现?


  • 始化时,以各个图片的配置计算其位置。
  • 将花字的各个元素合并成一个整体 Group
  • 所有元素以 Group 左上角为原点对齐,初始化时没有任何偏移
  • 计算出整个 Group 的最大宽高,以该尺寸作为一个初始状态 OriginSize
  • 依照上述初始状态,对每一个元素做初始化的偏移。如定位值为 17,那么他的left应该为(OriginSize.width - Self.width) / 2
  • 初始化后,之后的计算基本与定位值无关,我们记录初始化后的各个子元素与文本之间的距离,并把它们保存起来,文本 Change 时,对每一个子元素重新设定位置,即可


(上图中可以看到 “VLOG MY LIFE” 、 “HAVE A NICE DAY” 这两个黄色文字,其实是以图片形式展现的,他们的定位值分别为 17、20 )

8.jpg

多花字的线性布局中,初始化时、所有元素的垂直、水平偏移都需要累加上之前所有元素的宽高和;文本编辑时,将以初始化的位置为基础,依照文本框宽高的变化,对各个元素的位置进行动态计算。

9.jpg

未来发展

虽然目前的基础能力组件本身都有对应实现。但落实到具体业务上,我想还是有很长一段路要走的。从 0 到 1 很关键,但是想要创造实际价值, 1 只是起点。未来的发展我想主要从性能、功能两方面下手。
由于用户的设备配置参差不齐,对 Canvas 频繁的绘制会带来性能负担,我们本意是希望提升用户体验,但可能由于性能问题效果大打折扣。我们可以用多层的 Canvas 来实现特效。不同的特效分布在不同层级的 Canvas 上,这样可以灵活管理不同特效的性能开销,最终再合并导出。
我们的期望是能覆盖 80% 以上的需求,但除了花字以外的其他特效,我们对于用户的实际诉求支持不完善,没有丰富的材,没有做到将特效交给用户自由配置。我们可以先对齐专业图片编辑竞品的能力,再根据用户使用反馈,对一些特效行取舍和优化。

相关文章
|
11月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
585 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
9月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
520 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
10月前
|
存储 前端开发 JavaScript
调用DeepSeek API增强版纯前端实现方案,支持文件上传和内容解析功能
本方案基于DeepSeek API增强版,提供纯前端实现的文件上传与内容解析功能。通过HTML和JavaScript,用户可选择文件并调用API完成上传及解析操作。方案支持多种文件格式(如PDF、TXT、DOCX),具备简化架构、提高响应速度和增强安全性等优势。示例代码展示了文件上传、内容解析及结果展示的完整流程,适合快速构建高效Web应用。开发者可根据需求扩展功能,满足多样化场景要求。
3115 64
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
12月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
714 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
编解码 前端开发 开发者
探索无界:前端开发中的响应式设计深度实践与思考###
本文将带你领略响应式设计的精髓,一种超越传统页面布局限制的设计策略,它要求开发者以灵活多变的思维,打造能够无缝适应各种设备与屏幕尺寸的Web体验。通过深入浅出的讲解、实际案例分析以及技术实现细节的探讨,本文目的是激发读者对于响应式设计深层次的理解与兴趣,鼓励在实际应用中不断创新与优化。 ###
437 10
|
编解码 前端开发 开发者
前端开发中的响应式设计实践
前端开发中的响应式设计实践
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
344 4
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
674 4

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    768
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    348
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    272
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    236
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    343
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    475
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    278
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    159
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    272
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    308