我想读取png文件,查看图像数据并在不改变文件大小的情况下重新写入。根据libpng文档,png是无损的,并使用deflate和lz77进行压缩。在libpng中有一个示例项目声称可以读取和写入图像而不会丢失任何信息,它在像素值方面是正确的,但会更改文件结构(例如IDAT的数量,可选块等),从而更改png文件大小。
我的明确问题是:如何从压缩流(在libpng中为Zstream)中提取编码参数(例如deflate参数或lz77参数),并使用这些参数对原始图像进行编码,以创建与输入文件相同且没有任何更改的图像文件?
这是我的代码。我尝试将参数保存在info_ptr中以便写入图像,但不起作用。该怎么办?
我的明确问题是:如何从压缩流(在libpng中为Zstream)中提取编码参数(例如deflate参数或lz77参数),并使用这些参数对原始图像进行编码,以创建与输入文件相同且没有任何更改的图像文件?
这是我的代码。我尝试将参数保存在info_ptr中以便写入图像,但不起作用。该怎么办?
int main(int argc, char *argv[])
{
inname = argv[1];
outname = argv[2];
png_structrp read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(read_ptr);
if (!info_ptr)
{
png_destroy_read_struct(&read_ptr, (png_infopp)NULL, (png_infopp)NULL);
}
png_FILE_p imageFile, imageFile2, imageFileW;
imageFile=fopen(inname, "rb"); imageFileW = fopen(outname, "wb"); imageFile2 = fopen(inname, "rb");
int fileSize=fsize(imageFile2);
unsigned char* bufImWrite = malloc(sizeof(char)*fileSize);
fread(bufImWrite, 1, fileSize, imageFile2);
png_init_io(read_ptr, imageFile);
png_read_info(read_ptr, info_ptr);
png_uint_32 height;
height = info_ptr->height;
png_bytep * row_pointers;
row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
for (int y = 0; y < height; y++)
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(read_ptr, info_ptr));
png_read_image(read_ptr, row_pointers);
png_read_end(read_ptr, info_ptr);
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);;
png_init_io(png_ptr, imageFileW);
png_write_info(png_ptr, info_ptr);
//png_set_compression_level(png_ptr, 9);
//png_set_compression_window_bits(png_ptr, 15);
//png_set_compression_strategy(png_ptr, 3);
//png_set_compression_mem_level(png_ptr, 8);
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, info_ptr);
}