首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从AV_PIX_FMT_BGRA转换为PIX_FMT_PAL8?

如何从AV_PIX_FMT_BGRA转换为PIX_FMT_PAL8?
EN

Stack Overflow用户
提问于 2014-06-19 01:26:16
回答 1查看 1.2K关注 0票数 2

我很难将我的图像从AV_PIX_FMT_BGRA转换到PIX_FMT_PAL8。不幸的是,sws_getCachedContext不支持向PIX_FMT_PAL8的转换。

我想要做的是把我的图像转换成一个高质量输出的GIF视频。看来PIX_FMT_PAL8有可能提供我正在寻找的更高质量的输出。

根据这份文件,我需要调色像素数据,但我不知道如何做到这一点。

当像素格式被调色RGB (PIX_FMT_PAL8)时,调色板化的图像数据存储在AVFrame.data[0]中。调色板是用AVFrame.data[1]传输的,长1024字节(256个4字节条目),格式与上面描述的PIX_FMT_RGB32格式相同(也是特定于端点的)。还请注意,存储在AVFrame.data[1]中的各个RGB调色板组件应该在0..255的范围内。这一点很重要,因为许多定制的PAL8视频编解码器是为在IBM图形适配器上运行而设计的,它们使用6位调色板组件。

如有任何帮助或指导,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2014-07-29 15:23:25

下面的代码来自我自己的导出到ARGB/RGB(A)代码。我还没有测试它,但主要的想法应该足够清楚。

下面的代码是为了使颜色转换更易读而修改的,可能有一个更快的方法。

代码语言:javascript
复制
uint32_t* pal8_to_bgra(AVPicture* pict, int width, int height)
{
    size_t size = width * height * 4; /* times 4 because 4 bytes per pixel */
    uint32_t colours[255];
    uint32_t *buff = NULL;

    buff = malloc(size);
    if (buff == NULL) {
        fprintf(stderr,
                "Error allocating memory for subtitle bitmap.\n");
        return NULL;
    }

    for (int i = 0; i < 256; ++i) {
        /* Colour conversion. */
        int idx = i * 4; /* again, 4 bytes per pixel */
        uint8_t r = pict->data[1][idx],
                g = pict->data[1][idx + 1],
                b = pict->data[1][idx + 2],
                a = pict->data[1][idx + 3];
        colours[i] = (b << 24) | (g << 16) | (r << 8) | a;
    }

    for (int y = 0; y < rect->h; ++y) {
        for (int x = 0; x < rect->w; ++x) {
            /* 1 byte per pixel */
            int coordinate = x + y * pict->linesize[0];
            /* 32bpp color table */
            int idx = pict->data[0][coordinate];
            buff[x + (y * rect->w)] = colours[idx];
        }
    }

    return buff;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24297407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档