我正在尝试使用一个文件从一个文件复制到另一个文件libjpeg
.我试图使用jpeg_read_scanlines
/ jpeg_write_scanlines
来复制图像数据但据我所知这些函数计算DCT/IDCT加de /量化.我不需要执行这些操作,实际上我不想这样做.在数据复制后,我想对量化的DCT系数进行操作,因此使用ImageMagick或其他软件不是一种选择.没有IDCT/DCT步骤,有没有更快的方法呢?
是.您可以使用jpeg_read_coefficients()来为您读取量化的DCT系数.然后,您可以使用jpeg_write_coefficients()将它们写回另一个图像.典型用法如下:
struct jpeg_decompress_struct decomp; struct jpeg_compress_struct comp; jvirt_barray_ptr *coefficients; /* Set your error handlers for decomp and comp here */ jpeg_create_decompress(&decomp); /* Set your decompression source here */ jpeg_read_header(&decomp, 1); coefficients = read_coefficients(&decomp); jpeg_create_compress(&comp); jpeg_copy_critical_parameters(&decomp, &comp); comp.in_color_space = decomp.out_color_space; /* Not copied by previous call */ jpeg_write_coefficients(&comp, coefficients); jpeg_finish_compress(&comp); /* Destroy comp and decomp */
这个东西都在文件libjpeg.txt(特别是真正的原始数据部分)中描述,它包含在libjpeg-turbo的源代码发行版中.该部分还包括有关实际使用DCT系数并在再次写入之前对其进行操作的信息,但其基本流程如下:
/* assume that variables are as above */ for(int ci = 0; ci < total_components_in_image; ci++) { jpeg_component_info *info = decomp.comp_info + ci; JBLOCKARRAY buffer = (*decomp.mem->access_virt_barray) ((j_common_ptr) &decomp, coefficients[ci], 0, info->height_in_blocks, 0); }
所以现在,缓冲区是一个三维数组,其中缓冲区[y] [x] [c]是第x个块中的第c个系数,第y个块是向下的.access_virt_barray声明如下:
access_virt_barray(j_common_ptr cinfo, jvirt_barray_ptr ptr, JDIMENSION starting_row, JDIMENSION rows_to_read, boolean is_write_access);