当前位置:网站首页>Unity 加载读取PPT
Unity 加载读取PPT
2022-07-30 23:18:00 【柏雁】
效果
问题
本例子结合FancyScrollView,读取PPT效果。PPT读取的时候有点卡顿,建议优化一下,在程序启动前预加载一下PPT,缓存在内存里,体感会更好。
说明
Unity版本:2021.3.6f1c1
Unity API兼容等级:Net Framework4.x
DLL库:
Aspose.Slides:下载 .NET DLL 以读取编辑演示文稿|Aspose.Slideshttps://releases.aspose.com/slides/net/
System.Drawing:2021.3.6f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit中找
两个库我已经给大家封装在一个包里了,大家下载即可。
包名:PPT_FancyScrollView.unitypackage
链接:https://pan.baidu.com/s/1KAhXOgSty8yI-G_LkrnXhQ
提取码:n335
// 核心代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using UnityEngine;
using System.Threading.Tasks;
using Aspose.Slides;
namespace FancyScrollView.PPT
{
public class PPTDManager : MonoBehaviour
{
private static PPTDManager instance;
public static PPTDManager Instance
{
get
{
if (instance == null)
{
instance = new GameObject().AddComponent<PPTDManager>();
// instance = new PPTDManager();
}
return instance;
}
}
public Presentation LoadPPT(string path)
{
if (File.Exists(path) == false) return null;
return new Presentation(path);
}
private Dictionary<string, Sprite> itemDatasCash = new Dictionary<string, Sprite>();
public void LoadPPTByIndex(ItemData itemData, Action<Sprite> completion)
{
Sprite sprite;
var key = itemData.path + itemData.pageIndex;
if (itemDatasCash.TryGetValue(key, out sprite))
{
completion?.Invoke(sprite);
}
else
{
Presentation presentation = itemData.presentation;
int index = itemData.pageIndex;
var slide = presentation.Slides[index];
var bitmap = slide.GetThumbnail(1, 1);
Bitmap2Byte(bitmap, (bytes) =>
{
// PPT的尺寸
// int width = 960;
// int height = 540;
int width = Convert.ToInt16(presentation.SlideSize.Size.Width);
int height = Convert.ToUInt16(presentation.SlideSize.Size.Height);
Texture2D texture2D = new Texture2D(width, height);
texture2D.LoadImage(bytes);
sprite = Sprite.Create(texture2D, new Rect(0, 0, width, height), Vector2.zero);
if (itemDatasCash.ContainsKey(key) == false)
{
itemDatasCash.Add(key, sprite);
}
completion?.Invoke(sprite);
});
}
}
private async Task Bitmap2Byte(Bitmap bitmap, Action<byte[]> completion)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
byte[] data = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
await stream.ReadAsync(data, 0, Convert.ToInt32(stream.Length));
completion?.Invoke(data);
}
}
}
}
如果本文章对你有所帮助,请让我看到你的赞好吗?
边栏推荐
猜你喜欢
随机推荐
# Dasctf 7月赋能赛 WP
leetcode:127. 单词接龙
Day016 Classes and Objects
HF2022-EzPHP复现
The difference between ?? and ??= and ?. and || in JS
【LeetCode】55. 跳跃游戏 - Go 语言题解
StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?
mysql中关于存储过程无法实现迁移复制表中数据问题
Day016 类和对象
oracle数据库版本问题咨询(就是对比从数据库查询出来的版本,和docker里面的oracle版本)?
【MySQL】MySQL中对数据库及表的相关操作
MySQL索引常见面试题(2022版)
抽象类和接口(学习笔记)
Debezium error series 20: task failed to create new topic. Ensure that the task is authorized to create topics
2021GDCPC Guangdong University Student Programming Competition H.History
电脑快捷方式图标变白解决方案
"Wei cup" school more than 2022 cattle summer camp 4 Nancy (polocy) pelosi article variance law of Arts
[SAM模板题] P3975 [TJOI2015] 弦论
Compressing Deep Graph Neural Networks via Adversarial Knowledge Distillation
ZZULIOJ:1119: 数列有序