【发布时间】:2017-10-29 08:45:53
【问题描述】:
我想读取 png 文件,查看图像数据并再次写入,文件大小没有任何变化。基于libpng文件,png无损,使用deflate和lz77进行压缩。 libpng中有一个示例项目,声称可以无损读取和写入图像,它的像素值是正确的,但是改变了文件的结构(例如IDAT的数量,可选的块等)png文件大小。
我的明确问题: 如何从压缩流(libpng中的Zstream)中提取编码参数(例如deflate params或lz77 params),并使用该参数对原始图像进行编码以创建与输入文件相同的图像文件而不做任何更改?
这是我的代码。我尝试在 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);
}
【问题讨论】:
-
这是一个奇怪的请求。如果您不想更改文件,只需复制它即可。如果要更改图像内容,很可能无法达到完全相同的压缩率。如果你想改变一些标签,就地改变它们。
-
这个问题是正确的@YvesDaoust(否决票?)。他需要获取原始图像数据,并再次压缩此数据以生成相同的文件。它不同于复制(在压缩科学中)。您对这个问题的解决方案是什么?
标签: image-processing png libpng deflate