当前位置:网站首页>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);
}
}
}
}
如果本文章对你有所帮助,请让我看到你的赞好吗?
边栏推荐
猜你喜欢
【LeetCode】55. 跳跃游戏 - Go 语言题解
Apache Doris系列之:安装与部署详细步骤
EasyExcel comprehensive course combat
JS中? ?和??=和?.和 ||的区别
【LeetCode】64. 最小路径和 - Go 语言题解
Gxlcms audio novel system/novel listening system source code
阿里云视频点播+项目实战
可视化工具Netron介绍
PS Basic Learning (1)
2sk2225 Substitute 3A/1500V Chinese Documentation【PDF Data Book】
随机推荐
电脑快捷方式图标变白解决方案
Reverse linked list - in-place inversion method
【2022-05-31】JS逆向之易企秀
[SAM template question] P3975 [TJOI2015] string theory
EasyExcel综合课程实战
mysql获取当前时间
mysql锁机制
2022牛客暑期多校训练营1 J Serval and Essay
实验7(MPLS实验)
Go的Gin框架学习
【Untitled】
Successfully solved ImportError: always import the name '_validate_lengths'
Golang 切片删除指定元素的几种方法
StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?
Kotlin特殊类
flutter 做底部的三个按键,有叠加,有填充
Day016 类和对象
科技的成就(三十一)
解决一个Mysql的utf8编码导致的问题
win10重建索引