Рендеринг текста и его раскраска с использованием Freetype/Harfbuzz

Я визуализировал текст в Freetype и преобразовал его в растровое изображение с помощью Freetype. Созданное растровое изображение сохраняется в массиве символов, который впоследствии обрабатывается Targa Reader в виде изображения.tga. Теперь, как и когда назначать цвет для глиф при преобразовании глифа в растровое изображение или я должен использовать Freetype или Harfbuzz, чтобы раскрасить его?

2 ответа

Я не думаю, что harfbuzz делает что-то подобное для вас, это просто библиотека форм. Но с freetype, насколько я знаю, есть два подхода, чтобы нарисовать глифы и нарисовать их в растровое изображение. первый. по умолчанию, я думаю, он отображает глиф в растровое изображение в градациях серого. второй. Вы можете контролировать рендеринг глифов, отправляя некоторые обратные вызовы механизму freetype, и вместо того, чтобы делать это по типу freetype, он вызывает те функции, одна из которых предназначена для рисования отрезков строки с параметрами альфа, охват, x и y, чтобы вы могли легко манипулировать растровым изображением.

вы можете узнать больше о том, о чем я говорю, в одном из примеров кода freetype c @freetpye.org

И если вы находите это слишком сложным, что я не думаю, что, если ваш визуализированный растр все серый, и вы хотите применить к нему свой собственный цвет, как предлагает Эбрагим, вы можете использовать значения пикселей растрового изображения как альфа и сделать что-то как это:

unsigned char alpha = src[x, y];
red = color.r * alpha / 0xff;
green = color.g * alpha / 0xff;
blue = color.b * alpha / 0xff;
dst[x, y] = Color(red, green, blue);

надеюсь, что они могут помочь.

harfbuzz здесь не очень связан, так как не заботится о рендеринге самих аспектов.

Но свободный тип, как это обычно используется (учитывая, что речь не идет о цветных смайликах или других крайних случаях, с которыми я не знаком), режим рендеринга FT_RENDER_MODE_NORMAL, дает вам растровое изображение в градациях серого, в котором каждый пиксель выделяет один символ, в отличие от цветного изображения, которому требуется 3 в несколько раз больше (или в 4 раза, если у вас также есть альфа-канал), и он не заботится о цвете AFAIK, поэтому все, что вам нужно сделать, - это умножить вывод в оттенках серого при рендеринге произвольного цвета на нужный вам цвет. Примерно такой псевдокод:

coloredImage[x, y].r = r * grayScale[x, y] / 255;
coloredImage[x, y].g = g * grayScale[x, y] / 255;
coloredImage[x, y].b = b * grayScale[x, y] / 255;
Другие вопросы по тегам