Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: Alp от Март 11, 2010, 15:47



Название: Freetype2 + QImage
Отправлено: 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 - умеет.


Название: Re: Freetype2 + QImage
Отправлено: BRE от Март 11, 2010, 16:06
У google спрашивал?
Вот нашел статейку: http://pmg.org.ru/nehe/nehe43.htm


Название: Re: Freetype2 + QImage
Отправлено: Alp от Март 11, 2010, 16:27
У google спрашивал?
Вот нашел статейку: http://pmg.org.ru/nehe/nehe43.htm
Да, руководство от NeHe читал. Если использую подход, указанный в статье, в итоге все-равно получаю ерунду, как в приложенном изображении.


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


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