简化cjpeg

简化之后的代码

#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 // !__CJPEGHEADER__


#if 1
#ifdef _MSC_VER
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include "cdjpeg.h"     /* cjpeg/djpeg 应用的公共声明 */
#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_png.png"
//#define OUTPUT_FILE "Z:/PDF_OUT/output.png"
//#define INPUT_FILE "Z:/PDF_OUT/test_jpeg.jpg"
//#define OUTPUT_FILE "Z:/PDF_OUT/output_jpeg"
//#define INPUT_FILE "Z:/PDF_OUT/R.gif"
//#define OUTPUT_FILE "Z:/PDF_OUT/output_gif"
#define INPUT_FILE "Z:/PDF_OUT/test_bmp.bmp"
#define OUTPUT_FILE "Z:/PDF_OUT/output_bmp"

//typedef enum {
//    FORMAT_BMP,
//    FORMAT_GIF,
//    FORMAT_PNG,
//    FORMAT_JPEG
//} ImageFormat;
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_PNG;
    /*ImageFormat format = FORMAT_JPEG;*/
    //ImageFormat format = FORMAT_GIF;
    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;

    /* 用默认的错误处理初始化JPEG压缩对象 */
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);

    /* 添加一些应用程序特定的错误信息(来自cderror.h) */
    jerr.addon_message_table = cdjpeg_message_table;
    jerr.first_addon_message = JMSG_FIRSTADDONCODE;
    jerr.last_addon_message = JMSG_LASTADDONCODE;

    /* 设置JPEG默认参数 */
    cinfo.in_color_space = JCS_RGB;
    jpeg_set_defaults(&cinfo);

    /* 初始化读取PNG文件的源管理器 */
    //src_mgr = jinit_read_png(&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");  // READ_BINARY
    output_file = fopen(output_filename, "wb");  // WRITE_BINARY

    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;  /* 忽略重复的JFIF */
            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;  /* 忽略重复的Adobe */
            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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值