Как получить доступ к состоянию пикселя в монохромном растровом изображении с помощью freetype2

Вот фрагмент кода:

wchar_t wc=L"か";
FT_UInt glyph_index = FT_Get_Char_Index(face, wc);
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
if(face->glyph->format !=ft_glyph_format_bitmap)
{
    FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO);
}
FT_GlyphSlot slot = face->glyph;
int rows = slot->bitmap.rows;
int cols = slot->bitmap.width; 
for (int i = 0; i < rows; ++i) 
{
    for (int j = 0; j < cols; ++j) 
    {
        int off  = i * slot->bitmap.pitch + j / 8;
        if (slot->bitmap.buffer[off] & (0xC0 >> (j % 8))) 
        {
              //do something if above condition met
        }
}

Итак, как понять переменную off и условие slot->bitmap.buffer[off] & (0x80 >> (j % 8))?

По сути, аналогичный случай можно найти здесь. Функция была определена следующим образом:

bool glyphBit(const FT_GlyphSlot &glyph, const int x, const int y)
{
    int pitch = abs(glyph->bitmap.pitch);
    unsigned char *row = &glyph->bitmap.buffer[pitch * y];
    char cValue = row[x >> 3];

    return (cValue & (128 >> (x & 7))) != 0;
}

Это в основном эквивалентно приведенному выше фрагменту, поэтому я считаю, что существуют критерии индексации пикселей, но я не могу понять этого даже с официальный документ freetype2, кто может помочь?

0
0
180
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации, FT_RENDER_MODE_MONO означает, что вы визуализируете монохромное растровое изображение с использованием формата один бит на пиксель. Это означает, что каждый байт растрового изображения, которое вы только что визуализировали, представляет собой одну строку и 8 столбцов. Чтобы проверить, установлен ли пиксель в столбце j в битовой карте, вы должны проверить j-й бит в строке.

off теперь должен иметь больше смысла ... i * slot->bitmap.pitch + j / 8 получает смещение байт, в котором находится ваш пиксель. Вот почему он увеличивается только на 1 для каждых 8 столбцов. В конце концов, вы не можете выполнять чтение и запись в память со смещением, указанным в битах.

Тем не менее, предоставленный вами тестовый код выглядит как битый. Вторая версия использует 128, который имеет двоичное представление 10000000. >> (x & 7) дает вам каждый последующий бит по очереди, который затем может быть побитовым дополнением байта, в котором находится пиксель, чтобы проверить, действительно ли пиксель включен. Первая версия вашего кода вместо этого имеет 0xC0, который имеет побитовое представление 11000000, и поэтому тест на самом деле не делает то, что вы хотите (он проверяет, установлены ли пиксели j th и j + 1 th, если j % 8 не 7)

В монохромном растровом изображении каждый байт содержит 8 пикселей. Строка представлена ​​несколькими байтами в зависимости от ширины фактического изображения. Скажем, это было 10 пикселей, например. Тогда два байта представляют строку, и обычно конечные биты второго байта не установлены (0). Давайте пойдем дальше и скажем, что высота изображения была 2 (для упрощения), и, чтобы моя точка зрения была ясна, допустим, что изображение полностью белое. В 2D массив будет выглядеть так: {{0xff, 0xc0}, {0xff, 0xc0}}.

bigwillydos 10.09.2018 16:28

ключевой момент, который я упустил, - это «не может выполнять чтение и запись в память со смещением, указанным в битах». Таким образом, slot->bitmap.buffer[off] получит доступ к значению, которое начинается с off с длиной байта, затем перейдет к следующему off и так далее. Спасибо за вашу помощь:)

Finley 10.09.2018 16:38

Другие вопросы по теме