无法在 Xamarin Android 应用程序中加载用于 ImageSharp 的字体
Unable to load font for use with ImageSharp in Xamarin Android app
我有一个 Xamarin Forms 应用程序,其中我在 Android 项目的 Assets 文件夹中包含一个名为 Roboto-Regular.ttf
的字体文件。它的构建操作设置为 AndroidAsset
.
使用 SixLabors.Fonts
NuGet 包,我正在尝试加载此字体以将其用于水印。
但是,尝试使用资产流安装字体时,抛出异常:
System.NotSupportedException: Specified method is not supported.
var fonts = new FontCollection();
FontFamily fontFamily;
using (var fontStream = Assets.Open("Roboto-Regular.ttf"))
{
fontFamily = fonts.Install(fontStream); // Fails with "method not supported"
}
return fontFamily;
任何可能导致此问题的想法,或者是否有更好的方法来加载与 SixLabors.ImageSharp
包一起使用的字体?
编辑: 我尝试了 SushiHangover 的以下建议,但结果相同:
似乎基础 Stream
没有 Length
或 Position
属性(这解释了异常),所以现在我求助于转换为可搜索的 MemoryStream
相反:
using (var assetStreamReader = new StreamReader(Assets.Open("Roboto-Regular.ttf"))
{
using (var ms = new MemoryStream())
{
assetStreamReader.BaseStream.CopyTo(ms);
ms.Position = 0;
var fontFamily = new FontCollection().Install(ms);
}
}
查看 FontReader
实现,错误现在更有意义了:https://github.com/SixLabors/Fonts/blob/master/src/SixLabors.Fonts/FontReader.cs
但是,我不确定为什么 Assets
不是 return 可搜索的流?
有两种 Assets.Open
方法,一种提供 accessMode
(C# 访问枚举标志集):
using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
fontFamily = fonts.Install(fontStream);
}
public enum Access
{
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_BUFFER")]
Buffer = 3,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_RANDOM")]
Random = 1,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_STREAMING")]
Streaming,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_UNKNOWN")]
Unknown = 0
}
我有一个 Xamarin Forms 应用程序,其中我在 Android 项目的 Assets 文件夹中包含一个名为 Roboto-Regular.ttf
的字体文件。它的构建操作设置为 AndroidAsset
.
使用 SixLabors.Fonts
NuGet 包,我正在尝试加载此字体以将其用于水印。
但是,尝试使用资产流安装字体时,抛出异常:
System.NotSupportedException: Specified method is not supported.
var fonts = new FontCollection();
FontFamily fontFamily;
using (var fontStream = Assets.Open("Roboto-Regular.ttf"))
{
fontFamily = fonts.Install(fontStream); // Fails with "method not supported"
}
return fontFamily;
任何可能导致此问题的想法,或者是否有更好的方法来加载与 SixLabors.ImageSharp
包一起使用的字体?
编辑: 我尝试了 SushiHangover 的以下建议,但结果相同:
似乎基础 Stream
没有 Length
或 Position
属性(这解释了异常),所以现在我求助于转换为可搜索的 MemoryStream
相反:
using (var assetStreamReader = new StreamReader(Assets.Open("Roboto-Regular.ttf"))
{
using (var ms = new MemoryStream())
{
assetStreamReader.BaseStream.CopyTo(ms);
ms.Position = 0;
var fontFamily = new FontCollection().Install(ms);
}
}
查看 FontReader
实现,错误现在更有意义了:https://github.com/SixLabors/Fonts/blob/master/src/SixLabors.Fonts/FontReader.cs
但是,我不确定为什么 Assets
不是 return 可搜索的流?
有两种 Assets.Open
方法,一种提供 accessMode
(C# 访问枚举标志集):
using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
fontFamily = fonts.Install(fontStream);
}
public enum Access
{
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_BUFFER")]
Buffer = 3,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_RANDOM")]
Random = 1,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_STREAMING")]
Streaming,
[IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_UNKNOWN")]
Unknown = 0
}