Нужна помощь в компиляции кода jpegtran.c из libjpeg

Смотрите дно для обновлений

Я сталкиваюсь с рядом странных проблем. Для начала я использую последнюю версию Eclipse CDT и до do_rot_180, компилятор связал папку Projectname / включить но после этого теперь требуется конкретное включение / *. h, указанное ниже.

Что касается этой проблемы, то в обозревателе проектов кажется, что libjpeg.h отсутствует или недействителен, несмотря на то, что он находится в папке на диске.

Я работаю с libjpeg-9.

проблема затмения

Включает (включая то, что включены transupp.c и example.c):

включает в себя затмениежесткий диск включает в себя

Функции (do_rot_180 из transupp.c и read_JPEG_file из 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.

Я закомментировал материал по обработке ошибок в функции read_JPEG_file и хочу вызвать do_rot_180 изнутри, но я еще не дошел до этого.

Единственная подсказка, которую я нашел, это в transupp.c:

transupp.c

Дополнительное примечание: jpegtran.exe работает отдельно с скомпилированным .DLL, поэтому он должен быть где-то.


Редактировать — скопировать jpegint.h в include /, что решило проблемы включения.

#ifdef JPEG_INTERNALS
#include "jpegint.h"        /* fetch private declarations */
#include "jerror.h"     /* fetch error codes too */
#endif

Теперь он не может скомпилироваться, хотя кажется, что все они объявлены в jpeglib.h или jpegint.h:

ссылка не определена (4)


Редактировать 2 — код теперь содержит материал jpegtran.c для возможности поворота на 180 градусов. Обновленный блок кода:

/*********************************************************************************/
/* 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 — Внесенные изменения, упомянутые Джеффом, и я сталкиваюсь с этой проблемой при компиляции (в Eclipse):

cannot find -lC:\Users\tmp\workspace2\jpegManipulator\lib\libjpeg.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, установленная на вкладке библиотеки — она ​​определенно находится в каталоге.

Если я не включаю конкретный файл libjpeg.a, он жалуется на отсутствие ссылок на функции, но если я включаю его, он жалуется на то, что нет файла libjpeg.a, который можно найти. Это как для v9, так и для v6b.

cannot find -lC:\Users\tmp\workspace2\jpeg6bmanip\libs\libjpeg.a    jpeg6bmanip         C/C++ Problem
cannot find -lC:\Users\tmp\workspace2\jpeg6bmanip\libs\libjpeg.la   jpeg6bmanip         C/C++ Problem

Решение для Редактировать 3 проблема: https://stackoverflow.com/q/14692302/1666510 но новая проблема после этого. Не могу запустить программу или отладить ее, потому что он утверждает, что не может найти jpeglib.h.

0

Решение

У меня было нечто подобное при разработке с MinGW пару лет назад. Мне пришлось скачать исходный код libjpeg и собрать его на своем компьютере, чтобы получить файл libjpeg.a. Источник можно найти здесь:

http://www.ijg.org/

Проблема, которую я обнаружил при создании этой библиотеки, заключалась в том, что когда я выполнил «nm libjpeg.a», стало ясно, что символы в cdjpeg.h и transupp.h не компилируются в библиотеку. Я не смог найти способ сделать это с помощью configure, так как я не увидел ничего очевидного, когда выполнил ‘configure —help’. Вместо этого я отредактировал файл Makefile.in, где он определяет список файлов .lo для am__objects_1. В конце я добавил cdjpeg и transupp:

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 @[email protected]

Затем я сделал ‘make’ и ‘make install’, и символы присутствовали в библиотеке. На тот момент я смог получить ваш код для сборки. Эксперт по автоинструментам может найти лучший способ сделать это, но это по крайней мере поможет вам.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]