Я хочу использовать libbpg библиотека (написанная на C) в проекте C ++ (https://github.com/mirrorer/libbpg)
Мне нужно передать байты изображения в качестве входных данных вместо абсолютного пути к файлу изображения, и мне также нужен результат вывода в байтах (вместо «.png> .bpg» Мне нужны «байты> байты»).
Например. Я хотел бы захватывать кадры с веб-камеры и конвертировать их в байты bpg, а также передавать эти байты по сети
main
функция из libbpg bpgenc.c
принимает строку пути к файлу в качестве входного параметра
https://github.com/mirrorer/libbpg/blob/master/bpgenc.c#L2909
Любые предложения, как передать байты вместо имени файла?
Например, если камера возвращает байты изображения в формате BGR, как я могу преобразовать их в Image
из libbpg?
Просто продолжайте вникать в код, вы можете увидеть 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);
и, к счастью, есть такой вопрос для этого: читать изображение в формате png в буфере
Таким образом 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);
и это позволит оригинальной функции работать нормально.
Конечно, если все это слишком хлопотно, вы можете просто записать свои байты в файл и затем использовать библиотеку как обычно.
Других решений пока нет …