基于libjpeg-turbo,openjpeg 实现对jpeg,jpeg2000(j2k)图像的内存编解码(C++11封装)。
NOTE:
如果你只是想实现JPEG图像的内存解码,其实不需要这么复杂的,CImg 就可以解决你的问题,参见我的博客:
《CImg:插件(plugin)使用说明塈实现JPEG图像内存编码/解码》
git clone --recursive https://gitee.com/l0km/jpegwrapper.git
这里必须加上--recursive
参数,以确保同时下载做为git子模块加入项目的common_source_cpp项目
要求cmake (2.6以上版本)
Visual Studio 2015编译,windows CMD下执行build_msvc.bat
自动编译32/64位静态库(/MT /MD),共计4个版本
示例:
mkdir build
push build
# 编译64位代码
call "%VS140COMNTOOLS%..\..\vc/vcvarsall" x86_amd64
cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=RELEASE ^
-DCMAKE_INSTALL_PREFIX=../release/jpegwrapper_windows_vc_x86_64 ..
nmake install
popd
使用MinGW编译,执行build_gcc.bat,生成32还是64位程序取决于MinGW编译器版本,对于SJLJ
版本编译器可以同时生成32/64位库。
示例:
mkdir build_gcc_x86_64
pushd build_gcc_x86_64
cmake -G "MinGW Makefiles" ^
-DCMAKE_BUILD_TYPE=RELEASE ^
-DCMAKE_C_FLAGS=-m64 ^
-DCMAKE_INSTALL_PREFIX=../release/jpegwrapper-windows-gcc-x86_64 ..
make install -j8
popd
linux下的命令行编译:
# 创建编译文件夹
mkdir build.gcc
cd build.gcc
cmake -G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=../release/jpegwrapper-linux-x86_64 \
-DAUTO_BUILD_TEST=ON \
..
# AUTO_BUILD_TEST用于设定是否自动编译测试程序,默认为OFF
# 编译项目并安装到CMAKE_INSTALL_PREFIX指定的位置
make install
# 编译测试代码,默认情况下make不编译测试代码
make testCImg
linux下编译testCImg 需要libX11支持,如果没有,请安装,例如(CentOS):
sudo yum install -y libX11-devel
linux下编译脚本 build.sh,编译时可能需要根据自己linux系统的实际情况修改脚本。
生成的静态库在release文件夹下
执行 make_msvc_project.bat可以生成Visual Studio 2015工程
核心代码很少:
j2k_mem.h:jpeg图像内存读写实现
j2k_mem.h:jpeg2000图像内存读写实现
CImgWrapper.h:基于CImg进一步对jpeg,j2k图像读写做便利化封装,因为CImg.h体积很大,所以使用该头文件,会导致编译时间较长
参见附带的测试代码 testCImg.cpp
所有依赖的第三方库在 dependencies文件夹下,默认已经为openjpeg,turbojpeg提供了windows下msvc和MinGW编译编所需要的所有类型的release版本.linux版本需要用户自己执行对应的编译脚本编译。
download from http://sourceforge.net/projects/libjpeg-turbo/files/
official site http://libjpeg-turbo.virtualgl.org/
libjpeg-turbo-x.x.x.zip为源代码
编译jpeg-turbo需要NASM编译器支持
linux下的编译脚本
NOte:
为了确保在linux虚拟机下也能正确编译turbojpeg,上面的编译脚本中关闭了SIMD指令支持(-DWITH_SIMD=OFF
)。
SIMD指令支持对提高jpeg编解码效率很有帮助,如果要编译支持SIMD指令的版本,请在物理机linux系统下打开SIMD编译开关(-DWITH_SIMD=ON
)再执行编译脚本。
windows下编译脚本:
MinGW build_jpeg_turbo_gcc.bat
VS2015 build_jpeg_turbo_msvc.bat
download from http://cimg.eu/
download from http://www.openjpeg.org/
linux下的编译脚本
windows下编译脚本:
MinGW build_openjpeg_gcc.bat
VS2015 build_openjpeg_msvc.bat
cmake查找 jpegwrapper 库的示例:
# CONFIG模式查找 jpegwrapper 依赖库
# 需要在 CMAKE_MODULE_PATH 指定 FindTurboJPEG.cmake的位置,本例中的位置在项目根目录下/cmake/Modules
# 需要在 CMAKE_PREFIX_PATH 指定 jpegwrapper以及其依赖库turbojpeg,openjpeg的安装位置
find_package(jpegwrapper CONFIG REQUIRED)
cmake脚本中引用 jpegwrapper 库的示例:
# 引用jpegwrapper静态库
target_link_libraries(test_jpegwrapper gdface::jpegwrapper-static)
# 增加 openjpeg include
target_include_directories (test_jpegwrapper PUBLIC ${OPENJPEG_INCLUDE_DIRS})
cmake脚本中引用 jpegwrapper 库的完整示例参见 test/CMakeLists.txt
创建调用示例的VS2015工程:
set sh_folder=%~dp0
pushd %sh_folder%
mkdir build
cd build
call "%VS140COMNTOOLS%..\..\vc/vcvarsall" x86_amd64
rem 生成64位工程
set sh_folder=%sh_folder:\=/%
echo creating x86_64 Project for Visual Studio 2015 ...
cmake -G "Visual Studio 14 2015 Win64" ^
-DCMAKE_MODULE_PATH=%sh_folder%../cmake/Modules ^
-DCMAKE_PREFIX_PATH=%sh_folder%../release/jpegwrapper-windows-vc-x86_64;^%sh_folder%../dependencies/libjpeg-turbo-windows-vc-x86_64;%sh_folder%../dependencies/openjpeg-windows-vc-x86_64 ^
..
REM CMAKE_MODULE_PATH指定cmake module脚本位置
REM CMAKE_PREFIX_PATH指定jpegwrapper及其依赖库turbojpeg,openjpeg的安装位置
完整脚本参见 test/make_msvc_project.bat
生成unix Makefile过程参见: test/make_unix_makefile.sh