Невозможно загрузить шрифт для использования с ImageSharp в приложении Xamarin для Android
У меня есть приложение Xamarin Forms, в которое я включил файл шрифтов Roboto-Regular.ttf
в папке "Ресурсы" проекта Android. Его действие по сборке установлено на AndroidAsset
,
С использованием SixLabors.Fonts
Пакет NuGet, я пытаюсь загрузить этот шрифт, чтобы использовать его для водяных знаков.
Однако при попытке установить шрифт с использованием потока ресурсов выдается исключение, говорящее:
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, но он дает тот же результат:
2 ответа
Кажется основной 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
не возвращает искомый поток?
Есть два 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
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
}