libjpeg jpeg_write_coefficients

4

我已经创建了自己的DCT计算。

如何使用jpeg_write_coefficients将我的64个DCT值写入JPEG文件,使用jpeg_write_coefficients(它需要jvirt_barray_ptr * coef_arrays)?

我该如何创建它?


这个问题解决了吗?互联网上真的没有一个例子可以教你如何从原始数据中创建这样的数组结构,而不是只使用从“read coeff”函数得到的那个吗? - AngryDuck
3个回答

2
请查找文件中的request_virt_barray函数。此外,还要查看这个问题。它读取DCT系数而不是写入它们,但它应该让你了解系数数组的存储方式。除了系数之外,您还需要通过j_compress_ptr cinfo结构传递量化表。这是因为在libjpeg库内部,正向DCT和量化是一步完成的。如果要自己执行正向DCT,则必须自己执行量化。
另外,阅读libjpeg文档也很值得。虽然篇幅较长,但实际上相当易读,并且将极大地提高您对库的理解。最有用的文件是structure.txt。它具有有关内存管理和编码器结构的章节,这些章节可能会对您有所帮助。

我需要自己按顺序执行请求->分配->实现这些方法吗? - taker

0
您需要系数数组作为输入,以将文件编写为变量类型jvirt_barray_ptr 。 您可以通过从图像中读取它来填充它:

jvirt_barray_ptr *coeffs_array = jpeg_read_coefficients(&cinfo);

或者自己填充它。 然后您必须像这样编写DCT输入数据。 在以下函数中,我使用jpeg_decompress_struct作为输入,以将我的第一个图像头用于输出图像头。

int write_jpeg_file_dct(std::string outname,jpeg_decompress_struct in_cinfo, jvirt_barray_ptr *coeffs_array ){

    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    FILE * infile;

    if ((infile = fopen(outname.c_str(), "wb")) == NULL) {
      fprintf(stderr, "can't open %s\n", outname.c_str());
      return 0;
    }

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo, infile);

    j_compress_ptr cinfo_ptr = &cinfo;
    jpeg_copy_critical_parameters((j_decompress_ptr)&in_cinfo,cinfo_ptr);
    jpeg_write_coefficients(cinfo_ptr, coeffs_array);

    jpeg_finish_compress( &cinfo );
    jpeg_destroy_compress( &cinfo );
    fclose( infile );

    return 1;
}

-1

您可以按照jpeg_read_coefficients的方法来创建DCT系数管理器的结构,例如:

:dstInfo->mem->alloc_small,dstInfo->mem->request_virt_barray,dstInfo->mem->realize_virt_arrays

使用virt_barray_list获取目标dst,将新的DCT系数/量化表Q放入其中。然后调用jpeg_write_coefficients生成JPEG文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接