应用笔记:JPEG 压缩#
您可以了解有关算子功能的的信息。通过一个 VisualApplets 设计,展示了一个 JPEG 压缩应用。同时提供了一个生成 JPEG 数据文件的 SDK 项目。
在 VisualApplets 中进行 JPEG 压缩需要两个算子。它们是 ImageBuffer_JPEG_Gray 和 JPEG_Encoder_Gray。图像缓冲区用于在采集卡 Memory 中缓存图像数据,并用于对像素进行特定的重新排序。JPEG 编码器执行 JPEG 压缩本身。
之所以需要对像素进行重新排序,是因为 JPEG 压缩使用 8x8 像素的块。下图说明了重新排序过程。
![]()
重新排序后的图像将如下所示。该算子保持了原始图像的图像尺寸。
![]()
重新排序后,可以使用算子执行 JPEG 压缩 JPEG_Encoder_Gray。该算子的输出是不包含 JPEG 标头的 Huffman 流。压缩率取决于在运行时可更改的所选量化表。对于 Huffman 编码,使用标准亮度表。
算子文档
有关参数、输入链接和算子功能的详细描述,请参考算子参考。
JPEG 压缩设计示例#
以下设计示例将展示一个执行 JPEG 压缩的 VisualApplets 设计。该设计需要满足以下规格要求:
- 从 Camera Link 基础面阵相机采集图像。
- 对图像数据进行缓存并执行 JPEG 压缩。
- 在软件中向图像添加 JPEG 头部,并将选定的图像写入文件。
- 相机的图像高度不是恒定的。必须将可变的图像高度添加到 JPEG 头部中。
VisualApplets 设计#
采用以下设计来满足这些规格要求。

这个简单的设计足以满足所有规格要求。通过基础面阵相机算子采集图像。接下来,图像被分为两条路径。第一条路径对图像进行缓存,并使用算子 ImageBuffer_JPEG_Gray 执行像素重排序。随后使用 JPEG_Encoder_Gray 进行 JPEG 压缩。JPEG 数据流通过 DMA 通道传输到宿主机 PC Memory 中。在第二条路径中,原始图像数据被缓存并通过第二个 DMA 通道传输到宿主机 PC。
VisualApplets 设计仿真#
该设计可以进行完整仿真。通过在数据链接上放置仿真源和探测器,可以监控 JPEG 压缩的各个步骤。下图展示了带有仿真模块的设计。如图所示,原始图像的像素(simModule0)被重新排序(simModule1),并生成了 JPEG 数据流(simModule2)。

通过查看 JPEG 数据,可以确定数据流的长度(见下图)。如果更改了 JPEG 编码器中的 Quality,数据长度也会相应变化。

microDisplay 中的运行时测试#
任何包含 JPEG Encoder 的 applet 都可以直接在 microDisplay 中使用。对于给定的示例,该 applet 会为每个 DMA 通道生成一个图像窗口。第一个 DMA 号显示采集到的原始图像,而第一个 DMA 通道显示编码后的图像数据以及 DMA 长度。

用于生成 JPEG 文件的 SDK 项目#
该示例的设计文件连同 SDK 示例项目可以在以下文件夹中找到 examples\processing\advanced\JPEG\JPEG_gray 位于 VisualApplets 安装路径中。
该 SDK 项目基本上用于采集原始图像和 JPEG 数据。原始图像直接输出到显示器。生成 JPEG 头部并将其添加到 JPEG 数据中。这就完成了 JPEG 文件的制作。用户可以选择将 JPEG 快照写入文件。此外,编码后的 JPEG data 使用简单的 C 代码解码器进行解码 nanojpeg。随后将显示解码后的图像。
用户可以调整图像大小、更改 JPEG Quality、写入 jpeg 快照文件或写入 JPEG 数据十六进制文件转储。
请注意,头部生成仅作为一个示例。VisualApplets JPEG 算子的用户应编写适合其应用程序的自定义头部生成器。
JPEG 解码器信息:
NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder
Version 1.0 (2009-04-29)
by Martin J. Fiedler <martin.fiedler@gmx.net>