需要帮助从 libjpeg 编译 jpegtran.c 代码
更新见底部
我遇到了一些奇怪的问题.对于初学者,我使用的是最新的 Eclipse CDT,在实现 do_rot_180 之前,编译器链接了文件夹 projectName/include 但之后它现在需要指定特定的 include/*.h下面.
I am running into a number of odd problems. For starters, I'm using the latest Eclipse CDT and before implementing do_rot_180, the compiler linked the folder projectName/include but after it now requires specific include/*.h specified below.
与该问题相关,在项目资源管理器中,似乎认为 libjpeg.h 丢失或无效,尽管它位于磁盘上的文件夹中.
Related to that issue, in the project explorer, it seems to think libjpeg.h is missing or invalid despite it being in the folder on the disk.
我正在使用 libjpeg-9.
I am working with libjpeg-9.
包含(包含 transupp.c 和 example.c 包含的内容):
Includes (included what transupp.c and example.c included):
函数(do_rot_180 来自 transupp.c,read_JPEG_file 来自 example.c):
Functions (do_rot_180 is from transupp.c and read_JPEG_file is from example.c):
See updated code block below under Edit 2 (pretty much just jpegtran.c code)
This is the rotate function which is unused in jpegtran.c:
//LOCAL(void)
//do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
// JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
// jvirt_barray_ptr *src_coef_arrays,
// jvirt_barray_ptr *dst_coef_arrays)
///* 180 degree rotation is equivalent to
// * 1. Vertical mirroring;
// * 2. Horizontal mirroring.
// * These two steps are merged into a single processing routine.
// */
//{
// JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;
// JDIMENSION x_crop_blocks, y_crop_blocks;
// int ci, i, j, offset_y;
// JBLOCKARRAY src_buffer, dst_buffer;
// JBLOCKROW src_row_ptr, dst_row_ptr;
// JCOEFPTR src_ptr, dst_ptr;
// jpeg_component_info *compptr;
//
// MCU_cols = srcinfo->output_width /
// (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
// MCU_rows = srcinfo->output_height /
// (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
//
// for (ci = 0; ci < dstinfo->num_components; ci++) {
// compptr = dstinfo->comp_info + ci;
// comp_width = MCU_cols * compptr->h_samp_factor;
// comp_height = MCU_rows * compptr->v_samp_factor;
// x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
// y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
// for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
// dst_blk_y += compptr->v_samp_factor) {
// dst_buffer = (*srcinfo->mem->access_virt_barray)
// ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
// (JDIMENSION) compptr->v_samp_factor, TRUE);
// if (y_crop_blocks + dst_blk_y < comp_height) {
// /* Row is within the vertically mirrorable area. */
// src_buffer = (*srcinfo->mem->access_virt_barray)
// ((j_common_ptr) srcinfo, src_coef_arrays[ci],
// comp_height - y_crop_blocks - dst_blk_y -
// (JDIMENSION) compptr->v_samp_factor,
// (JDIMENSION) compptr->v_samp_factor, FALSE);
// } else {
// /* Bottom-edge rows are only mirrored horizontally. */
// src_buffer = (*srcinfo->mem->access_virt_barray)
// ((j_common_ptr) srcinfo, src_coef_arrays[ci],
// dst_blk_y + y_crop_blocks,
// (JDIMENSION) compptr->v_samp_factor, FALSE);
// }
// for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
// dst_row_ptr = dst_buffer[offset_y];
// if (y_crop_blocks + dst_blk_y < comp_height) {
// /* Row is within the mirrorable area. */
// src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];
// for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
// dst_ptr = dst_row_ptr[dst_blk_x];
// if (x_crop_blocks + dst_blk_x < comp_width) {
// /* Process the blocks that can be mirrored both ways. */
// src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
// for (i = 0; i < DCTSIZE; i += 2) {
// /* For even row, negate every odd column. */
// for (j = 0; j < DCTSIZE; j += 2) {
// *dst_ptr++ = *src_ptr++;
// *dst_ptr++ = - *src_ptr++;
// }
// /* For odd row, negate every even column. */
// for (j = 0; j < DCTSIZE; j += 2) {
// *dst_ptr++ = - *src_ptr++;
// *dst_ptr++ = *src_ptr++;
// }
// }
// } else {
// /* Any remaining right-edge blocks are only mirrored vertically. */
// src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x];
// for (i = 0; i < DCTSIZE; i += 2) {
// for (j = 0; j < DCTSIZE; j++)
// *dst_ptr++ = *src_ptr++;
// for (j = 0; j < DCTSIZE; j++)
// *dst_ptr++ = - *src_ptr++;
// }
// }
// }
// } else {
// /* Remaining rows are just mirrored horizontally. */
// src_row_ptr = src_buffer[offset_y];
// for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
// if (x_crop_blocks + dst_blk_x < comp_width) {
// /* Process the blocks that can be mirrored. */
// dst_ptr = dst_row_ptr[dst_blk_x];
// src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
// for (i = 0; i < DCTSIZE2; i += 2) {
// *dst_ptr++ = *src_ptr++;
// *dst_ptr++ = - *src_ptr++;
// }
// } else {
// /* Any remaining right-edge blocks are only copied. */
// jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,
// dst_row_ptr + dst_blk_x,
// (JDIMENSION) 1);
// }
// }
// }
// }
// }
// }
//}
除此之外,我实际上找不到 jcopy_block_row 的定义位置.我查看了所有包含文件及其 .c 对应文件.
On top of that, I can't actually find where jcopy_block_row is defined. I've looked through all of the include files and their .c counterparts.
我注释掉了 read_JPEG_file 函数中的错误处理内容,并想从内部调用 do_rot_180 但我还没有做到这一点.
I commented out the error handling stuff in the read_JPEG_file function and want to call do_rot_180 from within but I haven't gotten that far yet.
我在 transupp.c 中找到的唯一线索是:
The only clue I've found is this in transupp.c:
附加说明:jpegtran.exe 与编译后的 .DLL 分开工作,所以它必须在某个地方.
Additional note: jpegtran.exe works separately with the compiled .DLL so it's got to be somewhere.
编辑 - 将 jpegint.h 复制到 include/中,这解决了包含问题.
Edit - copied jpegint.h over into include/ which resolved the include issues.
#ifdef JPEG_INTERNALS
#include "jpegint.h" /* fetch private declarations */
#include "jerror.h" /* fetch error codes too */
#endif
现在它无法编译,即使它们似乎都在 jpeglib.h 或 jpegint.h 中声明:
Now it's unable to compile even though they all seem to be declared in jpeglib.h or jpegint.h:
编辑 2 - 代码现在包含 jpegtran.c 内容,仅能够旋转 180 度.更新代码块:
Edit 2 - code now contains jpegtran.c stuff for just being able to rotate 180 degrees. Updated code block:
/*********************************************************************************/
/* Defines */
/*********************************************************************************/
#define JPEG_INTERNALS
/*********************************************************************************/
/* Includes */
/*********************************************************************************/
#include <stdio.h>
#include <iostream>
#include "jinclude.h"
#include "jpeglib.h"
#include "cdjpeg.h"
#include "transupp.h"
#include "jerror.h"
#include <ctype.h>
#include <setjmp.h>
//using namespace std;
static char * infilename;
static char * outfilename;
static JCOPY_OPTION copyoption;
static jpeg_transform_info transformoption;
FILE * infile;
FILE * outfile;
void openFile(char file) {
if(file == 'i') {
infile = fopen(infilename, "rb");
}
else if(file == 'o') {
outfile = fopen(outfilename, "wb");
}
}
/*********************************************************************************/
/* Main Execution Block */
/*********************************************************************************/
int main() {
struct jpeg_decompress_struct srcinfo;
struct jpeg_compress_struct dstinfo;
struct jpeg_error_mgr jsrcerr, jdsterr;
jvirt_barray_ptr * src_coef_arrays;
jvirt_barray_ptr * dst_coef_arrays;
//int file_index;
srcinfo.err = jpeg_std_error(&jsrcerr);
jpeg_create_decompress(&srcinfo);
dstinfo.err = jpeg_std_error(&jdsterr);
jpeg_create_compress(&dstinfo);
jsrcerr.trace_level = jdsterr.trace_level;
srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;
//
outfilename = NULL;
copyoption = JCOPYOPT_DEFAULT;
transformoption.transform = JXFORM_NONE;
transformoption.trim = FALSE;
transformoption.force_grayscale = FALSE;
transformoption.transform = JXFORM_ROT_180;
//
std::cout << "Enter a filename to rotate 180 degrees." << std::endl;
std::cin >> infilename;
openFile('i');
std::cout << "Enter the output filename." << std::endl;
std::cin >> outfilename;
openFile('o');
//
jpeg_stdio_src(&srcinfo, infile);
jcopy_markers_setup(&srcinfo, copyoption);
(void) jpeg_read_header(&srcinfo, TRUE);
jtransform_request_workspace(&srcinfo, &transformoption);
src_coef_arrays = jpeg_read_coefficients(&srcinfo);
jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo,
src_coef_arrays,
&transformoption);
jpeg_stdio_dest(&dstinfo, outfile);
jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
jcopy_markers_execute(&srcinfo, &dstinfo, copyoption);
jtransform_execute_transformation(&srcinfo, &dstinfo,
src_coef_arrays,
&transformoption);
jpeg_finish_compress(&dstinfo);
jpeg_destroy_compress(&dstinfo);
(void) jpeg_finish_decompress(&srcinfo);
jpeg_destroy_decompress(&srcinfo);
//
if (infile != stdin)
fclose(infile);
if (outfile != stdout)
fclose(outfile);
return 0;
}
/*********************************************************************************/
/* End of Program */
/*********************************************************************************/
<小时>
编辑 3 - 进行了 Jeff 提到的更改,我在编译时遇到了这个问题(在 Eclipse 中):
Edit 3 - Made the changes Jeff mentioned and I am running into this problem when compiling it (in Eclipse):
cannot find -lC:Users mpworkspace2jpegManipulatorliblibjpeg.a jpegManipulator C/C++ Problem
Invalid project path: Duplicate path entries found (/jpegManipulator [Include path] base-path:jpegManipulator isSystemInclude:true includePath:include), path: [/jpegManipulator].jpegManipulator pathentry Path Entry Problem
我将工作区目录/lib 设置为库源,并在库选项卡中设置了特定的 libjpeg.a 库 - 它肯定在目录中.
I have workspace directory /lib set as library source and also the specific libjpeg.a library set in the libraries tab - It is definitely in the directory.
如果我不包含特定的 libjpeg.a 文件,它会抱怨缺少函数引用,但如果我包含它,它会抱怨说找不到 libjpeg.a.这适用于 v9 和 v6b.
If I don't include the specific libjpeg.a file, it complains about missing function references but if I do include it, it complains saying that there is no libjpeg.a to be found. This is for both v9 and v6b.
cannot find -lC:Users mpworkspace2jpeg6bmaniplibslibjpeg.a jpeg6bmanip C/C++ Problem
cannot find -lC:Users mpworkspace2jpeg6bmaniplibslibjpeg.la jpeg6bmanip C/C++ Problem
Edit 3问题的解决方案:https://stackoverflow.com/q/14692302/1666510 但之后的新问题.无法运行程序或调试它,因为它声称找不到 jpeglib.h.
Solution to Edit 3 problem: https://stackoverflow.com/q/14692302/1666510 but new problem after that. Can't run the program or debug it because it claims it cannot find jpeglib.h.
推荐答案
几年前我用 MinGW 开发时也发生过类似的事情.我必须下载 libjpeg 的源代码并在我的机器上构建它才能获得 libjpeg.a 文件.来源可以在这里找到:
I had something similar happen when developing with MinGW a couple of years ago. I had to download the source for libjpeg and build it on my machine in order to get the libjpeg.a file. The source can be found here:
http://www.ijg.org/
我在构建这个库时发现的问题是,当我执行nm libjpeg.a"时,很明显 cdjpeg.h 和 transupp.h 中的符号没有被编译到库中.我无法通过配置找到一种方法,因为当我执行配置 --help"时我没有看到任何明显的东西.相反,我编辑了 Makefile.in 文件,它定义了 am__objects_1 .lo 文件列表.我在末尾添加了 cdjpeg 和 transupp,如下所示:
The problem that I found when I built this library was that when I executed 'nm libjpeg.a' it became clear that the symbols in cdjpeg.h and transupp.h were not being compiled into the library. I couldn't find a way to do it via configure since I didn't see anything obvious when I did 'configure --help'. Instead I edited the Makefile.in file where it defines the am__objects_1 list of .lo files. I added cdjpeg and transupp at the end like this:
am__objects_1 = jaricom.lo jcapimin.lo jcapistd.lo jcarith.lo
jccoefct.lo jccolor.lo jcdctmgr.lo jchuff.lo jcinit.lo
jcmainct.lo jcmarker.lo jcmaster.lo jcomapi.lo jcparam.lo
jcprepct.lo jcsample.lo jctrans.lo jdapimin.lo jdapistd.lo
jdarith.lo jdatadst.lo jdatasrc.lo jdcoefct.lo jdcolor.lo
jddctmgr.lo jdhuff.lo jdinput.lo jdmainct.lo jdmarker.lo
jdmaster.lo jdmerge.lo jdpostct.lo jdsample.lo jdtrans.lo
jerror.lo jfdctflt.lo jfdctfst.lo jfdctint.lo jidctflt.lo
jidctfst.lo jidctint.lo jquant1.lo jquant2.lo jutils.lo
jmemmgr.lo cdjpeg.lo transupp.lo @MEMORYMGR@.lo
然后我执行了make"和make install",符号出现在库中.那时我能够构建您的代码.autotools 专家可能会想出一个更好的方法来做到这一点,但这至少会让你继续前进.
Then I did a 'make' and a 'make install' and the symbols were present in the library. At that point I was able to get your code to build. An autotools expert may be able to come up with a better way to do it but this will at least get you going.
相关文章