简化之后的代码
#ifndef __CJPEGHEADER__
#define __CJPEGHEADER__
typedef enum {
FORMAT_BMP,
FORMAT_GIF,
FORMAT_PNG,
FORMAT_JPEG
} ImageFormat;
int CjpegCompressImage(const char* input_filename, const char* output_filename_base, int quality, ImageFormat format);
#endif
#if 1
#ifdef _MSC_VER
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include "cdjpeg.h"
#include "jversion.h"
#include "jconfigint.h"
#include "cjpeg.h"
#define JMESSAGE(code, string) string,
static const char* const cdjpeg_message_table[] = {
#include "cderror.h"
NULL
};
#define INPUT_FILE "Z:/PDF_OUT/test_bmp.bmp"
#define OUTPUT_FILE "Z:/PDF_OUT/output_bmp"
boolean copy_markers = FALSE;
#if 0
int main()
{
const char* input_filename = INPUT_FILE;
const char* output_filename_base = OUTPUT_FILE;
int quality = 50;
ImageFormat format = FORMAT_BMP;
#else
int CjpegCompressImage(const char* input_filename, const char* output_filename_base, int quality, ImageFormat format) {
#endif
char output_filename[1024];
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cjpeg_source_ptr src_mgr;
FILE* input_file = NULL;
FILE* output_file = NULL;
JOCTET* icc_profile = NULL;
long icc_len = 0;
JDIMENSION num_scanlines;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jerr.addon_message_table = cdjpeg_message_table;
jerr.first_addon_message = JMSG_FIRSTADDONCODE;
jerr.last_addon_message = JMSG_LASTADDONCODE;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
switch (format) {
case FORMAT_BMP:
src_mgr = jinit_read_bmp(&cinfo, TRUE);
sprintf(output_filename, "%s.bmp", output_filename_base);
break;
case FORMAT_GIF:
src_mgr = jinit_read_gif(&cinfo);
sprintf(output_filename, "%s.gif", output_filename_base);
break;
case FORMAT_PNG:
src_mgr = jinit_read_png(&cinfo);
sprintf(output_filename, "%s.png", output_filename_base);
copy_markers = TRUE;
break;
case FORMAT_JPEG:
src_mgr = jinit_read_jpeg(&cinfo);
sprintf(output_filename, "%s.jpeg", output_filename_base);
copy_markers = TRUE;
break;
}
input_file = fopen(input_filename, "rb");
output_file = fopen(output_filename, "wb");
if (input_file == NULL) {
fprintf(stderr, "无法打开输入文件 %s\n", input_filename);
return EXIT_FAILURE;
}
if (output_file == NULL) {
fprintf(stderr, "无法打开输出文件 %s\n", output_filename);
return EXIT_FAILURE;
}
src_mgr->input_file = input_file;
char qualityarg = quality;
jpeg_stdio_dest(&cinfo, output_file);
set_quality_ratings(&cinfo, &qualityarg, FALSE);
(*src_mgr->start_input)(&cinfo, src_mgr);
jpeg_default_colorspace(&cinfo);
jpeg_start_compress(&cinfo, TRUE);
if (copy_markers) {
jpeg_saved_marker_ptr marker;
for (marker = src_mgr->marker_list; marker != NULL; marker = marker->next) {
if (cinfo.write_JFIF_header &&
marker->marker == JPEG_APP0 &&
marker->data_length >= 5 &&
GETJOCTET(marker->data[0]) == 0x4A &&
GETJOCTET(marker->data[1]) == 0x46 &&
GETJOCTET(marker->data[2]) == 0x49 &&
GETJOCTET(marker->data[3]) == 0x46 &&
GETJOCTET(marker->data[4]) == 0)
continue;
if (cinfo.write_Adobe_marker &&
marker->marker == JPEG_APP0 + 14 &&
marker->data_length >= 5 &&
GETJOCTET(marker->data[0]) == 0x41 &&
GETJOCTET(marker->data[1]) == 0x64 &&
GETJOCTET(marker->data[2]) == 0x6F &&
GETJOCTET(marker->data[3]) == 0x62 &&
GETJOCTET(marker->data[4]) == 0)
continue;
jpeg_write_marker(&cinfo, marker->marker, marker->data, marker->data_length);
}
}
while (cinfo.next_scanline < cinfo.image_height) {
num_scanlines = (*src_mgr->get_pixel_rows)(&cinfo, src_mgr);
(void)jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);
}
(*src_mgr->finish_input)(&cinfo, src_mgr);
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
fclose(input_file);
fclose(output_file);
return (jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
}
#endif
构建的cmake
option(PNG_SUPPORTED TRUE)
if(PNG_SUPPORTED)
# to avoid finding static library from CMake cache
unset(PNG_LIBRARY CACHE)
unset(PNG_LIBRARY_RELEASE CACHE)
unset(PNG_LIBRARY_DEBUG CACHE)
unset(ZLIB_LIBRARY CACHE)
unset(ZLIB_LIBRARY_RELEASE CACHE)
unset(ZLIB_LIBRARY_DEBUG CACHE)
set(CMAKE_PREFIX_PATH "Z:/PDFComress/vcpkg/packages/zlib_x64-windows/include;Z:/PDFComress/vcpkg/packages/zlib_x64-windows/debug;Z:/PDFComress/vcpkg/packages/libpng_x64-windows/include;Z:/PDFComress/vcpkg/packages/libpng_x64-windows/debug;Z:/PDFComress/vcpkg/packages/zlib_x64-windows/lib;Z:/PDFComress/vcpkg/packages/libpng_x64-windows/lib")
find_package(PNG 1.6 REQUIRED)
find_package(ZLIB REQUIRED)
target_include_directories(cjpeg PUBLIC ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
target_link_libraries(cjpeg ${PNG_LIBRARY} ${ZLIB_LIBRARY})
endif()
使用cjpeg
附加依赖项 (同cjpeg的 exe项目)
Z:\mozjpegProj\mozjpeg\build\Debug\cjpeg.lib
Z:\mozjpegProj\mozjpeg\build\Debug\jpeg.lib
Z:\PDFComress\vcpkg\packages\libpng_x64-windows\debug\lib\libpng16d.lib
Z:\PDFComress\vcpkg\packages\zlib_x64-windows\debug\lib\zlibd.lib
包含目录 (同cjpeg的exe项目)
Z:\mozjpegProj\mozjpeg\build
Z:\PDFComress\vcpkg\packages\libpng_x64-windows\include
Z:\PDFComress\vcpkg\packages\zlib_x64-windows\include
Z:\mozjpegProj\mozjpeg