我创建了自己的 DCT 计算。
如何使用(它需要)jpeg_write_coefficients
将我的 64 个 DCT 值写入 JPEG 文件?jpeg_write_coefficients
jvirt_barray_ptr * coef_arrays
我如何创建这个?
我创建了自己的 DCT 计算。
如何使用(它需要)jpeg_write_coefficients
将我的 64 个 DCT 值写入 JPEG 文件?jpeg_write_coefficients
jvirt_barray_ptr * coef_arrays
我如何创建这个?
环顾四周寻找request_virt_barray
函数 (in jmemmgr.c
)。
也看看这个问题。它正在读取 DCT 系数而不是写入它们,但它应该让您了解系数数组的存储方式。除了系数,您还需要传入量化表(通过j_compress_ptr cinfo
结构)。这是因为在 libjpeg 库内部,前向 DCT 和量化是一步完成的。如果你想自己做正向 DCT,你也必须自己做量化。
还值得阅读 libjpeg 文档。它很长,但实际上可读性很强,并且会大大提高您对库的理解。最有用的文件是structure.txt
. 它包含有关内存管理和编码器结构的部分,可能会对您有所帮助。
您需要系数数组作为输入来将文件写入变量类型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;
}
您可以按照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 文件。