Невозможно загрузить шрифт для использования с ImageSharp в приложении Xamarin для Android - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть приложение Xamarin Forms, в которое я включил файл шрифтов с именем Roboto-Regular.ttf в папку Assets проекта Android.Его действие по сборке установлено на AndroidAsset.

Используя пакет NuGet SixLabors.Fonts, я пытаюсь загрузить этот шрифт, чтобы использовать его для водяных знаков.

Однако пытаюсь установитьшрифт, использующий поток ресурсов, генерируется исключение:

System.NotSupportedException: указанный метод не поддерживается.

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, но оно дает тот же результат:

Android asset stream in Xamarin

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Существует два метода Assets.Open, и один обеспечивает accessMode (установлен флаг перечисления доступа C #):

using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
    fontFamily = fonts.Install(fontStream); 
}

re: 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
}
0 голосов
/ 19 сентября 2018

Кажется, что базовое 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 не возвращает искомый поток?

...