返回资讯中心
外部精选
软件工程
#开发者实时流

DotJpegli:基于 C# 的安全 JPEG 编码器发布

来源标题:DotJpegli – Fast, Portable, Memory-Safe JPEG Encoder

DotJpegli 是一个基于 Google Jpegli 的 C# JPEG 编码器,完全用托管 .NET 实现,不依赖原生库、P/Invoke 或 unsafe 代码。它支持将 RGB 或灰度像素编码为基线或渐进式 JPEG,可控制质量、采样、色彩配置文件和元数据,并在 .NET 10 和 .NET 11 上完整支持 NativeAOT 与裁剪。项目已提供 Windows x64 的 MSI、zip、exe 安装包。

Hacker News 最新nwah12026/11/6 · 今天16 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

DotJpegli 是一个安全、可移植的 C# JPEG 编码器,基于 Google Jpegli 实现。它可以将 RGB 或灰度像素编码为 baseline 或 progressive JPEG,并可控制质量、采样、色彩配置文件和元数据。该库完全以托管 .NET 实现,不依赖原生库,不使用 P/Invoke,不包含 unsafe 代码,也没有运行时 NuGet 依赖。在 .NET 10 和 .NET 11 上完全支持 NativeAOT 和裁剪。

下载 Windows 版(x64) DotJpegli.Cli-4.0.0-win-x64.msi · MSI 安装程序 win-x64 Windows x64 格式: .msi .zip .exe SHA256SUMS 其他平台、架构和软件包 选择平台和架构可切换主按钮,也可直接下载任意软件包:

Webb 的“宇宙悬崖”中,细腻的尘埃云、饱和的色彩和成千上万颗恒星使其成为一个要求苛刻的测试对象。打开 2400 × 1390 的源照片以查看其完整细节:

每个编码器接收相同的 RGB 像素。链接打开完整文件;文件大小包含头部和元数据。SSIMULACRA2 将每张解码图像与源图进行对比测量;分数越高,表示在该指标下与源图越接近。这些是針對一张照片选定的高质量设置。不同编解码器的质量标度并不相同,这些输出也并非在感知质量上相互匹配。根据该指标,JPEG XL 和 AVIF 在所示设置下保留了更多细节。此处 DotJpegli 比 Google 的 jpegli 小 214 字节;两者的字节和解码像素略有差异。JPEG XL 需要兼容的查看器。

下面的无损图展示了每张图像中相同的 480 × 300 细节,图像像素与源像素一一对应。以完整尺寸打开以比较恒星边缘、纤细尘埃和色彩过渡:

以安全、可移植的托管 C# 实现的全功能 JPEG 压缩,无需原生二进制文件或运行时依赖。

编码 Baseline 和 progressive JPEG,感知质量或距离,色度子采样和自定义扫描脚本。 像素输入 RGB、BGR、灰度及其他布局;byte、ushort 和 float 源;可配置的行跨度。 色彩与元数据 ICC 配置文件和源色彩转换,Exif、XMP、IPTC、注释和原始元数据标记。 输出与执行 字节数组或流,取消操作和可选的并行编码。 .NET 10 和 .NET 11 上的托管 SIMD,带有标量回退。

纯托管与 NativeAOT 零 unsafe 块、零 P/Invoke、零运行时 NuGet 依赖,完全兼容裁剪和 NativeAOT。

从 Releases 下载自包含的 NativeAOT dotjpegli 软件包或便携归档。下载适用于 Windows(x64、ARM64)、Linux(x64、ARM64)和 macOS(ARM64),无需安装 .NET。

dotjpegli encode input.png output.jpg --quality 90 --progressive dotjpegli encode input.png output.jpg --distance 1 --subsampling 444 --threads 4 有关安装、选项和本地发布,请参阅 CLI 指南。

每用户 .msi 安装程序(将 dotjpegli 添加到用户 PATH)、便携 .zip 归档和独立 .exe 可执行文件。 Debian/Ubuntu .deb、Fedora/RHEL/openSUSE .rpm、单文件 .AppImage、.flatpak 捆绑包和便携 .tar.gz。 Apple Silicon .pkg 安装程序(安装到 /usr/local/bin/dotjpegli)和临时签名的便携 .tar.gz 归档。

将 NuGet 软件包添加到任何 .NET Standard 2.1、.NET 10 或 .NET 11 项目,并将像素编码为字节数组或流。

dotnet add package DotJpegli --version 4.0.0 支持 .NET Standard 2.1、.NET 10 和 .NET 11。

dotnet add path/to/YourApp.csproj reference src/DotJpegli/DotJpegli.csproj 从源码构建需要 .NET SDK 11.0.100-rc.3.26522.148,该版本固定在 global.json 中,并启用预发布 SDK。

using DotJpegli; byte[] rgbPixels = [255, 0, 0]; // One red pixel, in R, G, B order. byte[] jpeg = JpegliEncoder.Encode(rgbPixels, width: 1, height: 1, options: new() Quality = 85 }); File.WriteAllBytes("output.jpg", jpeg); 对于 RGB 输入,默认是 baseline JPEG、质量 85 和 4:2:0 色度子采样。对于其他像素布局、行填充和更高精度的源,请参阅编码指南。

Alpha 通道会被忽略;请在编码前合成半透明像素。

using FileStream output = File.Create("progressive.jpg"); JpegliEncoder.Encode(output, rgbPixels, width: 1, height: 1, options: new() Quality = 85, Progressive = true }); 流重载可避免将完整的编码 JPEG 保留在返回的字节数组中。有关质量、采样和渐进控制,请参阅压缩和扫描选项。

这些图表在 24 张 Kodak 照片上比较了 DotJpegli 与原生 Google Jpegli。在匹配 PSNR 和 SSIM 的情况下,平均 JPEG 大小与原生版本的差异最多为 0.032%。在 AMD EPYC 9V45 上,progressive 编码平均比原生少用 29.6–30.5% 的时间;sequential 平均少用 15.7–16.8%。DotJpegli 每次编码平均产生 98.8–146.3 KiB 的托管 GC 分配,而 Google Jpegli 的原生堆请求为 1,924.8–4,288.3 KiB(测量包含输出 JPEG;并非峰值内存)。

请参阅方法和完整结果以及图表数据。完整对比未达到原生性能对等。

详细指南涵盖像素布局、ICC 色彩配置文件、扫描脚本、量化表、对等性证据和发布工程。

像素布局、采样、流和色彩空间。 ICC 配置文件、Exif、XMP、IPTC 和元数据编辑。 质量、距离、扫描脚本、并行执行和内存使用。 NativeAOT CLI 用法、便携下载以及 Windows、Linux 和 macOS 软件包。 标准和自定义表、传递函数和高级调优。 源码构建、聚焦测试、可复现性和部署检查。 可信发布设置以及从 CI 发布经过测试的软件包。 对比范围、接受界限和托管证据。 测量范围、编码延迟和 CI 诊断。 许可的高分辨率源图、七种编码器输出、文件大小和复现说明。

DotJpegli 生成有损的 8 位 JPEG,包括从更高精度源生成,甚至在质量 100 时也是如此。Jpegli 的质量标度不能与

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →