从TTF字体流创建GlyphTypeface对象

我知道如何通过给出绝对路径使用位于磁盘上的字体文件来创建GlyphTypeface对象。

GlyphTypeface glyphTypeface = new GlyphTypeface(new Uri(@"C:\SomeTrueTypeFont.ttf", UriKind.Absolute)); 

我无法弄清楚如何使用存储在内存流中的字体文件创建相同的GlyphTypeface对象。 由于权限等问题我的应用程序无法将字体流保存到磁盘。如果有人可以建议我如何去做,我很感激。

我不认为这是可能的。 WPF undercover使用依赖于物理文件的本机IDWriteFontFile接口。

可以从(副本) 流创建GlyphTypeface 。

它的实现方式与包装字体和WPF应用程序类似。

您必须将字体流复制到添加到PackageStore的内存中Package的PackagePart 。 关键部分是获取传递给GlyphTypeface构造函数的正确Uri 。

以下是内存包的一种可能实现:

 sealed class MemoryPackage : IDisposable { private static int packageCounter; private readonly Uri packageUri = new Uri("payload://memorypackage" + Interlocked.Increment(ref packageCounter), UriKind.Absolute); private readonly Package package = Package.Open(new MemoryStream(), FileMode.Create); private int partCounter; public MemoryPackage() { PackageStore.AddPackage(this.packageUri, this.package); } public Uri CreatePart(Stream stream) { return this.CreatePart(stream, "application/octet-stream"); } public Uri CreatePart(Stream stream, string contentType) { var partUri = new Uri("/stream" + (++this.partCounter), UriKind.Relative); var part = this.package.CreatePart(partUri, contentType); using (var partStream = part.GetStream()) CopyStream(stream, partStream); // Each packUri must be globally unique because WPF might perform some caching based on it. return PackUriHelper.Create(this.packageUri, partUri); } public void DeletePart(Uri packUri) { this.package.DeletePart(PackUriHelper.GetPartUri(packUri)); } public void Dispose() { PackageStore.RemovePackage(this.packageUri); this.package.Close(); } private static void CopyStream(Stream source, Stream destination) { const int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int read; while ((read = source.Read(buffer, 0, buffer.Length)) != 0) destination.Write(buffer, 0, read); } } 

这是一个示例代码,如何使用它来创建一个(副本) MemoryStream的 GlyphTypeface :

 GlyphTypeface glyphTypeface; using (var memoryPackage = new MemoryPackage()) { using (var fontStream = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "font")))) { var typefaceSource = memoryPackage.CreatePart(fontStream); glyphTypeface = new GlyphTypeface(typefaceSource); memoryPackage.DeletePart(typefaceSource); } } var familyName = glyphTypeface.FamilyNames[CultureInfo.GetCultureInfo("en-US")]; Console.WriteLine(familyName);