C# WPF 开发一个 Emoji 表情查看软件
微软在发布 Windows 11 系统的时候,发布过一个开源的 Emoji 表情 fluentui-emoji 。因为我经常需要里面的一些表情图片,在仓库一个个查找特别的不方便,所以我做了一个表情查看器,可以很方便的查看所有表情,同时可以定位到表情文件的位置。这套 fluentui-emoji 表情一共有 1545 个。
开源地址:https://github.com/he55/EmojiViewer
功能实现
fluentui-emoji 下的 assets 文件夹下的每一个子文件夹对应一个 Emoji 表情文件夹,表情文件夹里面的 metadata.json
文件储存着 Emoji 表情的元数据。3D
文件夹里面储存的是 256x256 的 png
图片,其他文件夹储存的是 svg
矢量图片。然后要做的就是遍历每一个文件夹,解析里面的元数据和图片文件
资产文件夹结构
Emoji 表情结构
metadata.json
文件结构
{
"cldr": "zany face",
"fromVersion": "5.0",
"glyph": "",
"glyphAsUtfInEmoticons": [
"1f92a_zanyface",
"hysterical"
],
"group": "Smileys & Emotion",
"keywords": [
"eye",
"goofy",
"large",
"small",
"zany face"
],
"mappedToEmoticons": [
"1f92a_zanyface"
],
"tts": "zany face",
"unicode": "1f92a"
}
数据解析
解析元数据,把 json 转成 Model。解析 json 文件我不想单独引入一个包,这里使用了一个只有 300 行代码的 json 解析库 TinyJson
- Model 类
public class EmojiObject
{
public string cldr { get; set; }
public string fromVersion { get; set; }
public string glyph { get; set; }
public string group { get; set; }
public string[] keywords { get; set; }
public string[] mappedToEmoticons { get; set; }
public string tts { get; set; }
public string unicode { get; set; }
}
- json 转成 Model
string filePath = Path.Combine(dir, "metadata.json");
string json = File.ReadAllText(filePath);
EmojiObject emoji = TinyJson.JSONParser.FromJson<EmojiObject>(json);
- 图片文件查找
string imageDir = Path.Combine(dir, "3D");
if (!Directory.Exists(imageDir))
imageDir = Path.Combine(dir, @"Default\3D");
var files = Directory.GetFiles(imageDir, "*.png");
- 对表情数据进行分组,完整解析代码可以看 https://github.com/he55/EmojiViewer
string dir = Path.GetFullPath(@"fluentui-emoji\assets");
List<EmojiAsset> assets = LoadData(dir);
List<EmojiCategory> categories = assets.GroupBy(x => x.emoji.group)
.Select(x => new EmojiCategory { title = x.Key, assets = x.ToList() })
.ToList();
listBox.ItemsSource = categories;
- 界面显示
<ui:GridView
x:Name="gridView"
SelectedIndex="0"
SelectionChanged="gridView_SelectionChanged">
<ui:GridView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<Border
x:Name="border"
Padding="1"
BorderThickness="2"
CornerRadius="5">
<Image
Width="96"
Height="96"
Source="{Binding previewImage, IsAsync=True}" />
</Border>
<TextBlock
Width="100"
Margin="0,2,0,0"
FontSize="10"
FontWeight="Bold"
Text="{Binding name}"
TextAlignment="Center"
TextWrapping="Wrap" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding isSelected}" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="{DynamicResource SystemControlHighlightAccentBrush}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ui:GridView.ItemTemplate>
</ui:GridView>
最终效果
完整代码:https://github.com/he55/EmojiViewer
C# WPF 开发一个 Emoji 表情查看软件的更多相关文章
- 【iOS开发】emoji表情的输入思路
1.自定义一个表情包类继承NSTextAttachment #import <UIKit/UIKit.h> /** 表情包的自定义类*/ @interface EmojiTextAttac ...
- 3种方法轻松处理php开发中emoji表情的问题
背景 做微信开发的时候就会发现,存储微信昵称必不可少. 可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面inse ...
- 使用 WPF 开发一个 Windows 屏幕保护程序
最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面.我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的. 本文将介绍如何为 Windows ...
- 用javascript写一个emoji表情插件
概述 以我们写的这个emoji插件为例,网上已经有一些相关的插件了,但你总感觉有些部分的需求不能被满足(如:可以自行添加新的表情包而不用去改源代码等等) 详细 代码下载:http://www.demo ...
- 用Java开发一个本地服务管理软件
一.最终界面先贴上最终效果图,图1为初始化界面,图二为点击启动/停止之后的中间过渡状态,图三为启动成功后弹出的提示框 把动态gif图片嵌入到jpg背景图中?用Adobe ImageReady即可办到 ...
- 一个emoji引发的一条血案:mysql存储emoji表情字符时报错解决
以下是我插入一条带表情的数据到mysql后出现错误 2019-03-04 14:24:40,462 ERROR 2807 [-/139.199.27.244/-/2ms POST /api/activ ...
- MySQL中支持emoji表情的存储
由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...
- 数据库需要支持emoji表情
由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...
- Emoji表情图标在iOS与PHP之间通信及MySQL存储
在某个 iOS 项目中,需要一个服务器来保存一些用户数据,例如用户信息.评论等,我们的服务器端使用了 PHP+MySQL 的搭配.在测试过程中我们发现,用户在 iOS 端里输入了 Emoji 表情提交 ...
- 如何将emoji表情存放到mysql数据库中
昨晚在爬取猫眼电影评论时在将评论信息插入到数据库中时出现问题,总是在插入一条数据时就会报错: 看着应该时字符编码的问题,比如新建的数据库新建的表,默认字符编码是:Latin1, 这种编码是无法插入中文 ...
随机推荐
- html5鼠标拖动排序及resize实现方案分析及实践
对列表进行拖动排序,尺寸改变.之前一般会使用jQuery-UI.其通过mousedown.mousemove.mouseup这三个事件来实现页面元素被鼠标拖拽的效果.vue-drag-resize v ...
- 揭露ROI提升5倍的秘密!火山引擎A/B测试白皮书重磅发布(内附下载链接)
- 文末立即下载白皮书原文 - 近期,<火山引擎A/B测试总体经济影响白皮书>正式发布.这份白皮书由市场研究公司Forrester调研撰写,揭示了A/B测试对于企业营收增长.运营成本.生 ...
- 火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构
整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中 ...
- Jmeter软件测试
1.1. 性能测试是什么 基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求 性能指标关注点:时间性能.空间性能 性能测试与页面无关 性能测试定义:指通过自动化的测试工 ...
- Python上下文管理器的高级使用
在文件处理和网络编程时,对于打开的文件不管最后内容处理是否符合预期都要在结束时关闭文件.这时常见的处理方法是try catch finally 的方法 f = open("demo.txt& ...
- Flask小知识集合
全局变量g的使用 flask在上下文中提供了四种变量,分别是: 变量名 上下文 说明 current_app 应用上下文 当前激活程序的程序实例 g 应用上下文 处理请求时用作临时存储的对象.每次请求 ...
- 【申请教程】ChatGPT访问互联网插件
https://openai.com/blog/chatgpt-plugins 大家好,我是章北海mlpy 申请ChatGPT插件很久了,一直没下文 最近看到两种套路,我早上试了一下,看能否快速成功吧 ...
- 题解 [HDU6746] Civilization(贪心+模拟)
来源:2020 年百度之星·程序设计大赛 - 初赛一 一道贪心 + 细节模拟题 题意很简单,这里不详细写了 观察题目,\(n\) 只有 500 ,可以 \(n \times n\) 枚举每个位置作为起 ...
- [kuangbin]专题九 连通图 题解+总结
kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...
- JavaScript到底应不应该加分号?JavaScript自动插入分号规则详解
JavaScript 提供了 automatic semicolon insertion (ASI)自动插入分号规则,在不加分号的情况下,会自动补充分号来分隔不同语句. 导致在继左大括号换行.tab ...