2015-11-17 3 views
0

У меня есть массив байтов в ресурсах приложения. Это особый стиль шрифта. Я хочу преобразовать этот массив байтов в System.Windows.Media.FontFamily.Преобразование байт [] в System.Windows.Media.FontFamily с использованием C#

Мой код:

byte[] fontdata = Application_IAD.Properties.Resources.Sansation_Regular; 

unsafe 
{ 
    fixed (byte* pFontData = fontdata) 
    { 
     pfc.AddMemoryFont((System.IntPtr)pFontData, fontdata.Length); 
    } 
} 

С помощью этого кода, у меня есть Sytem.Drawing.FontFamily, но я не могу преобразовать его в System.Windows.Media.FontFamily.

Вы можете мне помочь?

+0

Неправильный код, указатель, который вы передаете * должен * оставаться действительным до тех пор, пока используется шрифт. Это не так, сборщик мусора гасит его, когда он уплотняет кучу. Google «addmemoryfont marshal.alloccotaskmem», избегайте * многих * багги-примеров, которые сразу же называют Marshal.FreeCoTaskMem(). –

+1

Почему бы вам просто не упаковать 'Font' с приложением? Читайте здесь: https://msdn.microsoft.com/library/ms753303(v=vs.100).aspx – Jasper

+0

С веб-сайтом, который вы мне даете, я не могу заставить Джаспера помочь вам? – Moussawi

ответ

0

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

 //Writing bytes to a temporary file. 
     string tempFontFileLoation = "testFont.ttf"; 
     File.WriteAllBytes(tempFontFileLoation, yourBytesHere); 

     //Creating an instance of System.Windows.Media.GlyphTypeface. 
     //From here we will read all the needed font details. 
     var glyphTypeface = new GlyphTypeface(new Uri(tempFontFileLoation)); 

     //Reading font family name 
     string fontFamilyName = String.Join(" ", glyphTypeface.FamilyNames.Values.ToArray<string>()); 

     //This is what we actually need... the right font family name, to be able to create a correct FontFamily Uri 
     string fontUri = new Uri(tempFontFileLoation.Replace(Path.GetFileName(tempFontFileLoation), ""), UriKind.RelativeOrAbsolute).AbsoluteUri + "/#" + fontFamilyName; 

     //And here is the instance of System.Windows.Media.FontFamily 
     var fontFamily = new FontFamily(fontUri); 
+0

Я нашел решение моей проблемы. Я раскрываю вам свою идею. Вы помещаете свой шрифт в ресурсы проекта. Таким образом, создается массив байтов. После этого вы можете создать «FontFamily» следующим образом: «FontFamily fontFamily = new FontFamily (новый Uri (« pack: // application: ,,,/»),« ./#Your font Name »); надеюсь, это поможет вам ;-) – Moussawi

Смежные вопросы