ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JPEGView 第三方图像编解码库依赖全解析:子模块、许可证与从源码构建指南

JPEGView 第三方图像编解码库依赖全解析:子模块、许可证与从源码构建指南 桌面应用图像处理【免费下载链接】jpegviewFork of JPEGView by David Kleiner - fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF and TIFF images with a minimal GUI. Basic on-the-fly image processing is provided - allowing adjusting typical parameters as sharpness, color balance, rotation, perspective, contrast and local under-/overexposure.项目地址https://gitcode.com/gh_mirrors/jp/jpegview点击查看免费下载导读本文围绕 extras/third_party/README.md 展开系统梳理 JPEGView 所依赖的第三方图像编解码库包括它们各自承担的职责、所属许可证、在仓库中的预编译产物位置以及如何从源码重新构建dav1d、libde265、libheif、libjpeg-turbo、libjxl、libpng-apng、libwebp、Little-CMS、qoi、LibRaw。读完本文你将掌握 JPEGView 的图像格式支持矩阵背后的依赖关系、如何一键拉取所有子模块、如何在 Windows 上按步骤重建每一个库并理解预编译库与源码构建之间的取舍。依赖总览这些库在 JPEGView 中扮演什么角色JPEGView 是一个以极简 GUI 快速浏览 实时图像处理为特点的查看器其格式支持横跨 JPEG、BMP、PNG、WEBP、TGA、GIF、TIFF 以及 HEIC/AVIF、JPEG XL、QOI、RAW 等。这些能力并非全部由项目自身代码实现而是建立在大量成熟第三方库之上。extras/third_party目录正是这些子模块submodule的集合点仓库同时把这些库编译好的二进制产物直接放入src\JPEGView下因此普通编译 JPEGView 并不需要这些库的完整源码。从源码结构看每个第三方库都对应着src/JPEGView下的一个薄封装Wrapper封装层把库的能力收敛为统一的读图/写图接口第三方库封装源码src/JPEGView提供的能力libjpeg-turboTJPEGWrapper.hJPEG 解码/编码支持色度子采样信息TJSAMPlibpng-apngPNGWrapper.hPNG/APNG 解码、EXIF 块提取libwebpWEBPWrapper.hWebP 解码/编码支持动画帧与 EXIFlibheif 家族HEIFWrapper.h、AVIFWrapper.hHEIC/HEIF 与 AVIF 解码libjxlJXLWrapper.hJPEG XL 解码含动画、ICC profileqoiQOIWrapper.hQOI 解码/编码LibRawRAWWrapper.hRAW 相机图像读取返回CJPEGImage*Little-CMSICCProfileTransform.cppWebP、JPEG XL、HEIF/HEIC、AVIF 的 ICC Profile 色彩管理以 TJPEGWrapper.h 为例TurboJpeg::ReadImage输出的是BGRBGR...BGR000每像素 3 字节、按 4 字节边界补齐的内存布局输入则是一段 JPEG 压缩数据及其字节数这种内存缓冲进、BGRA/BGR 出的约定在 PNGWrapper.h、WEBPWrapper.h、JXLWrapper.h、AVIFWrapper.h 中高度一致——动画格式还会额外输出has_animation、frame_count、frame_time等参数。理解这个封装层有助于后续理解各库构建产物的用途。第一步拉取全部子模块所有依赖库都通过 Git 子模块方式固定版本。克隆仓库后在仓库根目录执行git submodule update --init --recursive该命令会递归初始化并检出extras/third_party下所有子模块以及某些库内部再嵌套的子模块如 libjxl 的 brotli。注意不执行此命令也不会影响 JPEGView 的编译因为src\JPEGView下已附带各库的.lib与头文件拉取子模块的目的是参考源码或从零重建。另外extras\scripts目录提供了各依赖库的自动构建脚本build*.bat等README 明确提醒任何写在第三方库文档里的手动构建步骤都可能过时以extras\scripts中的脚本为准。构建脚本面向的是那些希望从头重建库的用户——出于安全审计、验证或升级版本的目的git submodule update --init --recursive是使用这些脚本的前置条件。libheif 家族HEIC 与 AVIF 的基石libheif及其相关库构建后的产物位于src\JPEGView\libheif\bin[64]与src\JPEGView\libheif\lib[64]。同样完整源码并非编译 JPEGView 的必要条件。dav1d——AV1 解码器AVIF 基于 AV1 编码因此 dav1d 承担 AV1 解码职责许可证为 BSD 2-Clause Simplified。构建前需确保meson、ninja、nasm已在 PATH 中然后初始化 Win32/x64 构建环境并执行mkdir build cd build meson .. ninja构建完成后dav1d.dll位于build\src目录。libde265——开源的 H.265 实现HEIC 通常采用 H.265/HEVC 编码libde265 即是开源的 H.265 视频编解码实现许可证为 GNU LGPL v3。在初始化 Win32/x64 环境后直接运行build.bat [x86 | x64]产物位于bin_x86或bin_x64目录。libheif——HEIF/AVIF 格式的编解码器libheif 是 HEIF 与 AVIF 文件格式的编解码器本体许可证为 GNU LGPL v3。构建命令原 README 给出的流程为md build cd build cmake -GNMake Makefiles -DCMAKE_BUILD_TYPERelease -DDAV1D_LIBRARY..\..\dav1d\build\src -DLIBDE265_LIBRARY..\..\libde265\libde265 .. nmake注意-DDAV1D_LIBRARY与-DLIBDE265_LIBRARY分别指向前面步骤中 dav1d 与 libde265 的构建产物表明三者存在构建顺序依赖必须先有 AV1 解码器dav1d与 H.265 解码器libde265才能编译出完整的 heif 库。heif.dll与heif.lib位于build\libheif。在 JPEGView 侧libheif 的消费方是 HEIFWrapper.h 中的HeifReader它直接#include libheif/heif_cxx.h其ReadImage输出 4 字节 BGRA 像素同时返回 top-level 图像数量frame_count即多图 HEIF 的帧数与 EXIF 数据块而 AVIFWrapper.h 中的AvifReader同样基于 libheif 能力实现 AVIF 读取额外输出has_animation与每帧时长frame_time毫秒并维护一个静态缓存DeleteCache以加速多帧遍历。libjpeg-turboJPEG 编解码的性能担当libjpeg-turbo 的构建产物直接包含在src\JPEGView\libjpeg-turbo目录中即turbojpeg-static.lib与 jpeglib 系列头文件见 src/JPEGView/libjpeg-turbo。许可证为 3 种不同的 BSD 风格开源许可证libjpeg-turbo 的多重授权体系源码与 GPL 兼容但同样不参与 JPEGView 的编译过程。关键设计点是子模块所指向的提交即当前.lib与头文件对应的版本。这意味着如果你要精确复现 JPEGView 所使用的 libjpeg-turbo 行为应以子模块固定的 commit 为准而不是随意拉取最新主分支。JPEGView 中通过 TJPEGWrapper.h 使用它TurboJpeg::ReadImage负责解码同时通过TJSAMP枚举回传色度子采样方式TurboJpeg::Compress负责编码默认质量参数为 75输入内存布局同样要求 3 字节/像素并按 4 字节对齐BGRBGR...BGR000。libjxlJPEG XL 解码支持libjxlJPEG XL 参考实现构建产物包含在src\JPEGView\libjxl许可证为 BSD 3-Clause。JPEGView 通过 JXLWrapper.h 的JxlReader消费它——ReadImage输出 BGRA 像素、动画信息与 ICC profile内部DecodeJpegXlOneShot做一次性解码库本身同样维护静态缓存用于多帧读取。构建 libjxl 需要先在其子模块目录内完成嵌套子模块初始化brotli 等依赖git submodule update --init --recursive --depth 1 --recommend-shallow官方文档推荐的 Windows 构建方式使用 Clang/vcpkg但根据项目维护过程中对 jpegview PR #99 的调研结论使用msbuild同样可以完成构建。具体步骤如下32 位构建初始化 MSVS 的 32 位环境64 位构建则初始化 64 位环境在 libjxl 目录内mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DBUILD_TESTINGOFF .. -A Win32 msbuild.exe /p:PlatformWin32 /p:configurationRelease LIBJXL.sln /t:jxl_dec /t:jxl_threads64 位构建只需把上述命令中的Win32替换为x64。构建产物需按以下路径归位目标位置来源src\JPEGView\libjxl\bin[64]brotlicommon.dll、brotlidec.dll取自build\third_party\brotli\Releasejxl_dec.dll、jxl_threads.dll取自build\Releasesrc\JPEGView\libjxl\lib[64]jxl_dec.lib、jxl_threads.lib取自build\lib\Releasesrc\JPEGView\libjxl\include\jxlversion.h取自build\lib\include\jxl其余头文件取自extras\libjxl\lib\include\jxl特别提示JPEG XL 与 Visual C 运行库JPEG XL 依赖 Visual C 运行库vcruntime140.dll与msvcp140.dll。虽然微软允许将 VC 运行库与应用直接捆绑分发但由于 JPEGView 采用 GPL 许可证GPL FAQ 对以编译后 DLL 形式随程序分发 VC 运行库持否定态度。因此 JPEGView 的做法是不捆绑这些 DLL大多数用户系统已预装 VC 运行库若未安装则需要用户自行下载安装才能获得 JPEG XL 支持。这是从第三方依赖角度理解为什么某些格式支持依赖系统环境的典型示例。libpng-apng带 APNG 补丁的 libpnglibpng-apng.src-patch目录包含对官方 libpng 打上APNGAnimated PNG补丁与 x64 支持补丁后的源码构建产物libpng16.lib、zlib.lib位于src\JPEGView\libpng-apng。完整源码同样非编译 JPEGView 所必需。该子模块内部又嵌套了三个部分libpngPNG 参考库许可证为 PNG Reference Library License version 2libpng-apng对官方 libpng 的补丁实现为 PNG 增加动画帧支持许可证与 libpng 相同zliblibpng 的压缩后端许可证为 zlib permissive license。JPEGView 的 PNGWrapper.h 体现了这一依赖的实际用途PngReader::MustUseLibpng用于判定该 PNG 是否不被 GDI 支持——即对 APNG 等 GDI 无法处理的 PNG 必须走 libpng 路径ReadImage返回帧数、帧时长与动画标记GetEXIFBlock则从 PNG 中提取 EXIF 数据块。注意该封装在WINXP编译宏下会被裁剪XP 兼容构建不含这些扩展能力。libwebpWebP 编解码libwebp 构建产物包含在src\JPEGView\libwebplibwebp.lib、libwebpdemux.lib许可证为 WebM Software Licence源码与 GPL 兼容、非编译必需。与 libjpeg-turbo 一样子模块指向的提交即当前.lib与头文件的版本来源。WEBPWrapper.h 的WebpReaderWriter同时提供读写ReadImage解码含动画帧与 EXIFCompress编码并暴露lossless与quality百分比无损模式下忽略两个关键参数FreeMemory负责释放压缩产物。Little-CMSICC Profile 色彩管理引擎Little-CMS 2lcms2是 JPEGView 的色彩管理引擎用于支持WebP、JPEG XL、HEIF/HEIC、AVIF中携带的 ICC Profile 转换构建产物位于src\JPEGView\lcms2头文件 lcms2.h许可证为 MIT。其消费方是 ICCProfileTransform.cpp对应 ICCProfileTransform.h——从 JXLWrapper、HEIFWrapper 等解码路径取出的 ICC profile 会被交给 lcms2 做颜色空间转换从而保证这些现代格式在屏幕上呈现准确的色彩。qoi零依赖直接编译进 JPEGViewqoiQuite OK Image Format是一个极简图像格式许可证为 MIT。它的特点在 README 中被明确强调QOI 源码被直接编译进 JPEGView不引入任何二进制依赖——所以该子模块仅用于标注当前内嵌版本的来源。QOIWrapper.h 中的QoiReaderWriter提供ReadImage输出 3 字节 BGR 补齐到 4 字节边界或 4 字节 BGRA与Compress输入同样为 3 字节/像素、4 字节对齐的内存布局并与 WebP/JPEG 编码器一样自带FreeMemory释放接口。LibRawRAW 相机图像读取LibRaw 是用于读取和处理数码相机 RAW 图像的开源库构建产物位于src\JPEGView\libraw头文件位于 src/JPEGView/libraw/include/libraw。其许可证为双许可GNU LGPL v2.1 或 CDDL v1.0使用者可在两者中选择。RAWWrapper.h 中的RawReader接口与前面所有封装不同ReadImage直接接收文件路径LPCTSTR strFileName并返回CJPEGImage*JPEGView 自己的图像类见 JPEGImage.h同时支持bGetThumb缩略图读取模式与内存耗尽标志。预编译库 vs 从源码构建如何选择综合 README 与extras\scripts\README.md的信息可以给出清晰的决策依据绝大多数场景默认无需构建任何库。所有依赖的.lib、.dll、头文件都已随仓库提供在src\下直接编译 JPEGView 即可。需要从零重建时先git submodule update --init --recursive然后使用extras\scripts下的build*.bat脚本面向安全审计、结果验证、依赖升级等诉求。一个必须知晓的客观限制重建的库与仓库中预编译产物不可能 1:1 完全一致——编译器会在二进制中写入自身信息因此逐字节比对必然失败不能以此断言构建过程出错。许可证速查表库许可证dav1dBSD 2-Clause Simplifiedlibde265GNU LGPL v3libheifGNU LGPL v3libjpeg-turbo3 种不同的 BSD 风格开源许可证libjxlBSD 3-Clauselibpng / libpng-apngPNG Reference Library License version 2zlibzlib permissive licenselibwebpWebM Software LicenceLittle-CMSMITqoiMITLibRawGNU LGPL v2.1 或 CDDL v1.0二选一这份许可证清单与 JPEGView 自身的 GPL 授权共同构成了发布与再分发的合规边界例如前文提到的GPL 程序不得捆绑 VC 运行库 DLL正是这一边界的具体体现。小结JPEGView 的格式支持广度并非靠自研编解码器堆砌而是通过 10 个第三方库含 libheif 家族的 dav1d/libde265分层实现的JPEG 由 libjpeg-turbo、PNG/APNG 由打过补丁的 libpng、WebP 由 libwebp、HEIC/AVIF 由 libheif 家族、JPEG XL 由 libjxl、QOI 由内嵌源码、RAW 由 LibRaw色彩管理则统一交给 Little-CMS。仓库通过子模块锁定版本 预编译产物随仓库分发的双轨策略既让普通用户开箱即编也为深度用户保留了从源码完整重建的可能。若需深入各封装层的具体实现可继续阅读 src/JPEGView 下的各 Wrapper 源码及其调用方如 JPEGImage.cpp、SaveImage.cpp。赞分享桌面应用图像处理【免费下载链接】jpegviewFork of JPEGView by David Kleiner - fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF and TIFF images with a minimal GUI. Basic on-the-fly image processing is provided - allowing adjusting typical parameters as sharpness, color balance, rotation, perspective, contrast and local under-/overexposure.项目地址https://gitcode.com/gh_mirrors/jp/jpegview点击查看免费下载相关推荐JPEGView 编译依赖完整指南WTL 子模块集成、许可证约束与第三方图像解码库管理JPEGView 编译依赖完整指南WTL 子模块集成、许可证约束与第三方图像解码库管理 本文围绕 deps/README.md https://link.gi桌面应用图像处理SRS 许可证全解析MIT 主许可证与第三方依赖库的授权合规指南SRS 许可证全解析MIT 主许可证与第三方依赖库的授权合规指南 SRS 是一个支持 RTMP、WebRTC、HLS、HTTP FLV、SRT、GB28181音视频后端直播HalfStyle核心原理揭秘CSS伪元素与字符分割的实现机制HalfStyle核心原理揭秘CSS伪元素与字符分割的实现机制 HalfStyle是一个创新的CSS技术插件它允许开发者对字符的每一半或三分之一进行独立样式前端UI库/组件上一篇Claude Code Harness Night Watch 组件解析AI 开发夜间巡检的实现思路下一篇CerebroSignal插件安全通讯工具快速访问创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表