libbpg-如何传递字节而不是文件路径

时间:2018-11-15 09:04:42

标签: c++ c bpg

我想在C ++项目(https://github.com/mirrorer/libbpg)中使用 libbpg 库(用C编写)

我需要传递图像字节作为输入而不是图像文件的绝对路径,并且我也需要输出结果以字节为单位(而不是“ .png> .bpg”,我需要“ bytes> bytes”)。 / p>

例如我想从摄像头捕获帧并将其转换为bpg字节,然后通过网络传递这些字节

libbpg的main

bpgenc.c函数将文件路径字符串作为输入参数

https://github.com/mirrorer/libbpg/blob/master/bpgenc.c#L2909

有没有建议如何传递字节而不是文件名?

例如,如果相机返回的图像字节为BGR格式,那么如何将其转换为libbpg的Image

1 个答案:

答案 0 :(得分:0)

只要继续研究代码,您就会看到main正在调用load_image

2909: img = load_image(&md, filename, color_space, bit_depth, limited_range,

,其调用read_png(1456)或read_jpeg(1459)。例如,对于png,该文件在以下位置使用:

950: png_init_io(png_ptr, f);

令人高兴的是,有一个SO问题:read a png image in buffer

因此,当Shahbaz回答时,您需要伪造阅读内容(直接从该答案中获取):

struct fake_file
{
    unsigned int *buf;
    unsigned int size;
    unsigned int cur;
};

static ... fake_read(FILE *fp, ...) /* see input and output from doc */
{
    struct fake_file *f = (struct fake_file *)fp;
    ... /* read a chunk and update f->cur */
}

struct fake_file f = { .buf = pngBuff, .size = pngbuffleng, .cur = 0 };
/* override read function with fake_read */
png_init_io(png_ptr, (FILE *)&f);

这将使原始功能正常工作。

当然,如果所有这些都太麻烦了,您可以将字节写入文件,然后正常使用该库。