我已经使用libpng使用c将灰度png图像转换为原始图像。在该lib中,函数 png_init_io 需要文件指针来读取png。但我传递png图像作为缓冲区是否有任何其他替代函数来读取png图像缓冲区到原始图像。请帮帮我
int read_png(char *file_name,int *outWidth,int *outHeight,unsigned char **outRaw) /* We need to open the file */
{
......
/* Set up the input control if you are using standard C streams */
png_init_io(png_ptr, fp);
......
}
而我需要这个
int read_png(unsigned char *pngbuff, int pngbuffleng, int *outWidth,int *outHeight,unsigned char **outRaw) /* We need to open the file */
{
}
答案 0 :(得分:1)
从png_init_io
的手册中,您可以使用png_set_read_fn
覆盖读取功能。
这样做,你可以欺骗png_init_io
以为它正在从文件中读取,而实际上你正在从缓冲区中读取:
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);