4

我创建了自己的 DCT 计算。

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

我如何创建这个?

4

3 回答 3

2

环顾四周寻找request_virt_barray函数 (in jmemmgr.c)。

也看看这个问题。它正在读取 DCT 系数而不是写入它们,但它应该让您了解系数数组的存储方式。除了系数,您还需要传入量化表(通过j_compress_ptr cinfo结构)。这是因为在 libjpeg 库内部,前向 DCT 和量化是一步完成的。如果你想自己做正向 DCT,你也必须自己做量化。

还值得阅读 libjpeg 文档。它很长,但实际上可读性很强,并且会大大提高您对库的理解。最有用的文件是structure.txt. 它包含有关内存管理和编码器结构的部分,可能会对您有所帮助。

于 2011-11-02T00:19:45.957 回答
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;
}
于 2015-01-17T13:20:07.103 回答
-1

您可以按照jpeg_read_coefficients创建 dct 系数管理器的结构,例如

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

并用于virt_barray_list获取 dst 目标以将新的 dct 系数/quantyTableQ 放入其中。然后调用 jpeg_write_coefficients 生成 JPEG 文件。

于 2014-10-30T08:51:13.577 回答