我已经创建了自己的DCT计算。
如何使用jpeg_write_coefficients (需要jvirt_barray_ptr * coef_arrays)使用jpeg_write_coefficients将我的64DCT值写入JPEG文件?
我该如何创建它?
发布于 2011-11-02 08:19:46
查找(在jmemmgr.c中) request_virt_barray函数。
还可以看看这个question。它读取DCT系数,而不是写入它们,但它应该让您了解系数数组的存储方式。除了系数之外,您还需要传入量化表(通过j_compress_ptr cinfo结构)。这是因为在libjpeg库中,正向DCT和量化是在一个步骤中执行的。如果你想自己做前向DCT,你也必须自己做量化。
阅读libjpeg文档也是值得的。它很长,但实际上可读性很好,这将极大地提高您对该库的理解。最有用的文件是structure.txt。它有关于内存管理和编码器结构的章节,可能会对你有所帮助。
发布于 2015-01-17 21:20:07
您需要系数数组作为输入,才能将文件写为变量类型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;
}发布于 2014-10-30 16:51:14
您可以按照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文件。
https://stackoverflow.com/questions/7949630
复制相似问题