C++ freetype中的RGB像素格式

C++ freetype中的RGB像素格式,c++,freetype,C++,Freetype,我很难理解像素是如何存储在freetype下的,问题的核心部分是如何在渲染轮廓后提取RGB值 typedef uint32_t Tindex; // FT_Render_Glyph(face->glyph, FT_RENDER_MODE_LCD); // FT_Bitmap bitmap = face->glyph->bitmap; FT_Glyph_Metrics metrics = face->glyph->metrics; // Tindex colStart

我很难理解像素是如何存储在freetype下的,问题的核心部分是如何在渲染轮廓后提取RGB值

typedef uint32_t Tindex;
//
FT_Render_Glyph(face->glyph, FT_RENDER_MODE_LCD);
//
FT_Bitmap bitmap = face->glyph->bitmap;
FT_Glyph_Metrics metrics = face->glyph->metrics;
//
Tindex colStartPos = metrics.horiBearingX >> 6;
Tindex rowStartPos = metrics.horiBearingY >> 6;
//
for (Tindex y = 0; y < bitmap.rows; y = y + 3)
{
    Tindex row = rowStartPos + y;
    for (Tindex x = 0; x < bitmap.width; x = x + 3)
    {
        Tindex col = colStartPos + x;
        uint8_t r = bitmap.buffer[y * bitmap.width + x];
        uint8_t g = bitmap.buffer[y * bitmap.width + x + 1];
        uint8_t b = bitmap.buffer[y * bitmap.width + x + 2];
        img(col, row) = pixel{r, g, b, 255};
        // img and pixel are placeholders to simplify the code
    }
}
我用

g++ -std=c++11 $(freetype-config --cflags) main.cpp -lpng $(freetype-config --libs)
文档()中的AFAIU循环应该是这样的:

for (Tindex y = 0; y < bitmap.rows; y++)
{
    Tindex row = rowStartPos + y;
    for (Tindex x = 0; x < bitmap.width; x++)
    {
        Tindex col = colStartPos + x;
        uint8_t r = bitmap.buffer[y * bitmap.pitch + x*3];
        uint8_t g = bitmap.buffer[y * bitmap.pitch + x*3 + 1];
        uint8_t b = bitmap.buffer[y * bitmap.pitch + x*3 + 2];
        img(col, row) = pixel{r, g, b, 255};
        // img and pixel are placeholders to simplify the code
    }
}
for(Tindex y=0;y
表示在默认的
FT\u PIXEL\u MODE\u GRAY
模式下,每个像素存储在1个字节中,表示灰色阴影。您可以手动将其转换为RGBA,或者您可以使用一些Freetype功能,如
FT\u PIXEL\u MODE\u LCD
FT\u Bitmap\u convert()
。不过我自己还没有尝试过。

您的代码会得到什么样的输出?(上次我使用FT时,
glyph->bitmap
仍然是一个简单的灰度位图。)@Jongware我在使用
FT_RENDER_MODE_NORMAL
时没有问题,但是我需要一个亚像素精度更好的东西,
FT_RENDER_MODE_NORMAL
给了我一个灰色调色板,我没有问题。你所做的应该可以用(该模式下的rgb似乎是由一个字节值组成的三元组),你用这种方法有没有错误?唯一的改变是你不应该把x增加3,是缓冲区指针移动了3。@Ashalynd我不明白,它是交错的还是平面的?我必须移动值并键入双关的东西?它是一个平面缓冲区,但你在迭代位图时没有添加正确的偏移量。看docs:FT_Bitmap.pitch是每行的字节数。你能展示一下你是如何使用这段代码的吗?如果没有看到这段代码,很难回答。正如我所说,如果没有看到其余的代码,很难说。我已经更新了第一篇文章,我将删除以前的注释,因为它们现在已经没有用了。
[y*Bitmap.pitch+x*3+OFFSET]
看起来像是一个交错存取的公式,而不是一个平面公式,但我仍然不知道像素是如何存储在这个缓冲区中的。
for (Tindex y = 0; y < bitmap.rows; y++)
{
    Tindex row = rowStartPos + y;
    for (Tindex x = 0; x < bitmap.width; x++)
    {
        Tindex col = colStartPos + x;
        uint8_t r = bitmap.buffer[y * bitmap.pitch + x*3];
        uint8_t g = bitmap.buffer[y * bitmap.pitch + x*3 + 1];
        uint8_t b = bitmap.buffer[y * bitmap.pitch + x*3 + 2];
        img(col, row) = pixel{r, g, b, 255};
        // img and pixel are placeholders to simplify the code
    }
}