无法在 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 没有 LengthPosition 属性(这解释了异常),所以现在我求助于转换为可搜索的 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); 
}

回复:https://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String,%20int)

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
}