我很难将我的图像从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位调色板组件。
如有任何帮助或指导,将不胜感激。
发布于 2014-07-29 15:23:25
下面的代码来自我自己的导出到ARGB/RGB(A)代码。我还没有测试它,但主要的想法应该足够清楚。
下面的代码是为了使颜色转换更易读而修改的,可能有一个更快的方法。
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;
}https://stackoverflow.com/questions/24297407
复制相似问题