我已经创建了自己的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
函数。此外,还要查看这个问题。它读取DCT系数而不是写入它们,但它应该让你了解系数数组的存储方式。除了系数之外,您还需要通过j_compress_ptr cinfo
结构传递量化表。这是因为在libjpeg库内部,正向DCT和量化是一步完成的。如果要自己执行正向DCT,则必须自己执行量化。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系数/量化表Q放入其中。然后调用jpeg_write_coefficients
生成JPEG文件。