.NET PrivateFontCollection - загружать шрифты разных стилей - PullRequest
2 голосов
/ 02 февраля 2011

Я пытаюсь перенести приложение из традиционного ASP.NET в Azure, и у меня возникает проблема со шрифтами. Есть компонент, который визуализирует изображения с текстом, нарисованным на нем определенным нестандартным шрифтом (давайте назовем шрифт «Вода»).

Вода существует в виде нескольких различных файлов TTF, каждый из которых представляет свой стиль. Всего у меня 12 различных файлов TTF, включая такие стили, как «Water Black Italic», «Water Light», «Water Regular», «Water Ultralight» и т. Д.

В ASP.NET это был простой случай установки шрифтов в каталог Windows, а затем из кода, вызывающего:

Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);

Однако в Azure вы не можете устанавливать свои собственные шрифты. Поэтому, чтобы иметь возможность рисовать эти шрифты на изображении, мне нужно загрузить файлы шрифтов как контент с приложением и использовать класс PrivateFontCollection для их индивидуальной загрузки.

Мой текущий код такой:

        PrivateFontCollection fontcollection = new PrivateFontCollection();
        string fontpath = string.Concat(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "assets\\");
        fontcollection.AddFontFile(string.Concat(fontpath,"water-bold-webfont.ttf"));
        fontcollection.AddFontFile(string.Concat(fontpath, "water-ultralight-webfont.ttf"));
        fontcollection.AddFontFile(string.Concat(fontpath, "water-medium-webfont.ttf"));
        FontFamily[] privatefontfamilies = fontcollection.Families;


        Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
        Font _fontSmall = new Font("Water UltraLight", iFontSmall, System.Drawing.GraphicsUnit.Pixel);
        Font _fontMini = new Font("Water Bold", iFontMini, System.Drawing.GraphicsUnit.Pixel);

У меня проблема в том, что после разрыва после добавления файлов шрифтов в коллекции fontcollection.Families есть только одно семейство: «Вода».

Аналогичным образом, после того, как объекты шрифта были объявлены, по умолчанию семейство становится Microsoft Sans-Serif. Если я вместо этого использую:

Font _fontMedium = new Font("Water", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);

Шрифт загружается с семейством "Water", но, похоже, не дает мне возможности правильно выбрать стиль. Мои единственные параметры стиля шрифта - те, которые определены в перечислении FontStyle, которые не охватывают все стили шрифтов, которые я пытаюсь загрузить.

Короче говоря, учитывая конкретный шрифт и все его доступные стили, загруженные в отдельные файлы TTF, как бы вы загрузили их в PrivateFontCollection и использовали их по отдельности?

Ответы [ 2 ]

1 голос
/ 07 октября 2011

ссылаясь на ваш код выше, вы можете попробовать ...

Font _fontMedium = 
    new Font(privatefontfamilies[0] , iFontMedium, FontStyle.Regular, 
             System.Drawing.GraphicsUnit.Pixel);

вместо того, чтобы задавать шрифт строкой fontname.

Microsoft говорит (Источник: MSDN ):

Первый аргумент, передаваемый конструктору Font, - это имя семейства шрифтов (а не объект FontFamily, какслучай для других вариаций конструктора Font)

Я изо всех сил пытался понять, что это определенно неправильно (и не работает)!Используя имя шрифтовой семьи, шрифт, который вы хотите создать, заменяется аналогичным (как вы написали выше).Использование fontfamily-object в качестве параметра работает нормально (для меня).

0 голосов
/ 07 февраля 2011

У меня есть ответ на это. Некоторое время я боролся за то, чтобы заставить PrivateFontCollection работать, и у GDI ничего этого не было.

Я начал копаться в собственных функциях Win32, таких как AddFontResource, чтобы посмотреть, смогут ли они что-нибудь сделать. В конце концов я понял, что все, что вам нужно сделать, это упаковать файлы шрифтов TTF как содержимое пакета, добавить записи реестра в «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts» для каждого шрифта, чтобы зарегистрировать его, а затем Вы можете просто создать новый шрифт с именем, которое вы дали ключу реестра.

Короче говоря:

AddFont("Water (TrueType)", string.Concat(fontpath, "Water-Black.ttf"));

Font myfont = new Font("Water Black",16f);

private void AddFont(string fontname, string path) {
    Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", fontname, path, RegistryValueKind.String);
}

Похоже, что это отлично работает на dev, я пойду тест на постановку и доложу.

...