Russian Qt Forum
Май 19, 2024, 15:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Freetype2 + QImage  (Прочитано 4473 раз)
Alp
Гость
« : Март 11, 2010, 15:47 »

Пытаюсь сделать просмотр шрифта. Рендерится  фритайпом2, отображается в QImage. Однако не получается: после сохранения QImage'а картинка оказывается цветная, вместо градаций серого, в каком виде, собственно, её и отдает фритайп. Вот код, которым я это пытаюсь сделать:

Код
C++ (Qt)
QPreviewWidget::QPreviewWidget(QWidget* parent) :
       QWidget(parent),
       str("Small brown fox jumping over the lazy dog"),
       size(24)
{
   int e;
 
   e = FT_Init_FreeType(&library);
   e = FT_New_Face( library, "arial.ttf", 0, &face );
   e = FT_Set_Char_Size( face, size << 6, size << 6, 96, 96 );
   e = FT_Set_Pixel_Sizes( face, size, size );
 
   Render();
}
 
void QPreviewWidget::Render()
{
   int e;
 
 
   for(int i = 0; i < str.length(); ++i)
   {
       e = FT_Load_Char(face, str[i].toAscii(), FT_LOAD_RENDER);
       if( e )
           continue;
 
       int wdt = face->glyph->bitmap.width;
       int hgt = face->glyph->bitmap.rows;
       int ptc = face->glyph->bitmap.pitch;
       uchar* buffer = face->glyph->bitmap.buffer;
 
       QImage img(buffer, wdt, hgt, ptc, QImage::Format_Indexed8);
       bool valid = !img.isNull();                     //Ok, it is true
       bool gray = img.allGray();                    //Ok, it is true
       bool grayscale = img.isGrayscale();       //Ok, it is true
       img.save("qweqwe.bmp", "BMP", 100);   //WTF???? Picture is colorful!!
   }
}
 

Как правильно отрендерить строчку текста фритайпом и загнать её всю в QImage?

PS: Использовать QT-шные возможности нельзя, она не умеет Type1, ни виндовые, ни маковские, а FT2 - умеет.
Записан
BRE
Гость
« Ответ #1 : Март 11, 2010, 16:06 »

У google спрашивал?
Вот нашел статейку: http://pmg.org.ru/nehe/nehe43.htm
Записан
Alp
Гость
« Ответ #2 : Март 11, 2010, 16:27 »

У google спрашивал?
Вот нашел статейку: http://pmg.org.ru/nehe/nehe43.htm
Да, руководство от NeHe читал. Если использую подход, указанный в статье, в итоге все-равно получаю ерунду, как в приложенном изображении.
Записан
BRE
Гость
« Ответ #3 : Март 11, 2010, 16:44 »

Код
C++ (Qt)
       QImage img(buffer, wdt, hgt, ptc, QImage::Format_Indexed8);
 
Ты пытаешься создавать QImage в палитровом формате.
В нем каждый байт картинки определяет индекс специальной палитры (смотри QImage::colorTable) из которой уже берется значение RGB.
На сколько я помню FT хранит в каждом байте уровень серого.
Т.е. формат картинки FT не совместим с QImage, поэтому и получается каша.
Тебе придется конвертировать все руками.
Записан
Alp
Гость
« Ответ #4 : Март 11, 2010, 16:59 »

Код
C++ (Qt)
       QImage img(buffer, wdt, hgt, ptc, QImage::Format_Indexed8);
 
Ты пытаешься создавать QImage в палитровом формате.
В нем каждый байт картинки определяет индекс специальной палитры (смотри QImage::colorTable) из которой уже берется значение RGB.
На сколько я помню FT хранит в каждом байте уровень серого.
Т.е. формат картинки FT не совместим с QImage, поэтому и получается каша.
Тебе придется конвертировать все руками.
Ага, спасибо. Подозревал, что форма Indexed не с проста.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 17.