Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать изображение с нужным шрифтом 
:(
    Опции темы
killobyte
Дата 1.9.2010, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.9.2010

Репутация: нет
Всего: нет



Доброго времени суток. Каким образом можно создать изображение с заданным текстом, написанным заданным шрифтом?
желательно на голом x11

Это сообщение отредактировал(а) killobyte - 1.9.2010, 23:10
PM MAIL ICQ Jabber   Вверх
Amp
Дата 2.9.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



FreeType
PM MAIL   Вверх
proc_maker
Дата 14.9.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: 1
Всего: 1



10 минут гугления дали примерно следующий пример. В результате имеем массив пикселов каждой буквы - далее пакуйте в нужный формат и все:

Код

#include <stdio.h>
#include <freetype/freetype.h>
#include <freetype/ftglyph.h>

inline int next_p2(const int a)
{
   int rval = 1;
   while (rval < a)
   {
      rval <<= 1;
   }

   return rval;
}

int main(int, char*[])
{
   const char* const pString = "Some text";
   const char* const pFontFileName = "/usr/share/fonts/TTF/DejaVuSans.ttf";
   const int h = 14;

   FT_Library freeTypeLibrary;

   do
   {
      // Init the library
      if (0 != FT_Init_FreeType(&freeTypeLibrary))
      {
         printf("Unable to initialize FreeType library\n");
         break;
      }

      do
      {
         // Create a font
         FT_Face font;
         if (0 != FT_New_Face(freeTypeLibrary, pFontFileName, 0, &font))
         {
            printf("Unable to load font\n");
            break;
         }

         FT_Set_Char_Size(font, h << 6, h << 6, 96, 96);

         for (const char* c = pString; 0 != c and '\0' != *c; ++c)
         {
            if (0 != FT_Load_Glyph(font, FT_Get_Char_Index(font, *c), FT_LOAD_DEFAULT ))
            {
               printf("Unable to load glyph\n");
               break;
            }

            FT_Glyph glyph;
            if (0 != FT_Get_Glyph(font->glyph, &glyph))
            {
               printf("Unable to get glyph\n");
               break;
            }

            // Convert the glyph to raster
            FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);

            const FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;
            const FT_Bitmap& bitmap = bitmapGlyph->bitmap;

            const int width = next_p2(bitmap.width);
            const int height = next_p2(bitmap.rows);

            const unsigned int buffSize = 2 * width * height;
            unsigned char* pBuffer = new unsigned char[buffSize];
            memset(pBuffer, 0, buffSize);

            for (int j = 0; j <height; ++j)
            {
               for(int i = 0; i < width; ++i)
               {
                  pBuffer[2 * (i + j * width)] = pBuffer[2 * (i + j * width) + 1] =
                     (i >= bitmap.width || j >= bitmap.rows) ? 0 : bitmap.buffer[i + bitmap.width * j];
               }
            }

            // TODO: Pack the image to somewhere

            // Release the buffer
            delete [] pBuffer;

            // Destroy glyph
            FT_Done_Glyph(glyph);
         }

         // Destroy font
         FT_Done_Face(font);
      } while (0);

      // Release the library
      if (0 != FT_Done_FreeType(freeTypeLibrary))
      {
         printf("Unable to release FreeType library\n");
         break;
      }
   } while(0);

   return 0;
}


PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.