多帧Dicom文件部分阅读器无法读取及FFmpeg生成无损JPEG咨询
问题背景
我开发了一款分两大步骤的C++程序:
- 使用FFmpeg从视频中提取帧并转换为JPEG,命令如下:
ffmpeg -i videofile.mp4 -q:v 1 -r desired_framerate tmp_04%d.jpeg - 通过DCMTK将这些JPEG图像生成多帧Dicom文件,单张图像处理示例代码如下:
// Example for one image // Get the n-th image QFile* imageFile = new QFile("Path/To/Image"); // Read the image inside a byte array QByteArray * ba = new QByteArray(); imageFile->open(QIODevice::ReadOnly); *ba = imageFile->readAll(); // Insert the byte array in the Dicom file cond = jpegPixelItem->putUint8Array(reinterpret_cast<Uint8 *>(ba->data()), ba->size()); // Rinse and repeat
该程序生成的文件可在多数阅读器中正常显示,但部分阅读器提示传输语法错误。目前使用的传输语法为JPEGLossless:Non-hierarchical-1stOrderPrediction,但只有改为有损的JPEG Baseline (Process 1),这些阅读器才能读取文件。怀疑问题出在FFmpeg提取帧的步骤,可能生成的是有损JPEG,但已使用了网传的最优参数-q:v 1。
核心问题:
- 为何部分阅读器可正常显示该Dicom文件,而部分不行?
- 是否存在通过FFmpeg命令生成无损JPEG图像的方法?
解答
1. 阅读器兼容性差异原因
问题核心是传输语法声明与实际图像编码不匹配:
- 你指定的传输语法属于无损JPEG标准,但FFmpeg用
-q:v 1生成的是高画质有损JPEG(归属于JPEG Baseline编码体系,本质仍是有损压缩)。 - 严格遵循DICOM标准的阅读器会校验传输语法与图像实际编码的一致性,发现不匹配就抛出「传输语法错误」;而部分宽松的阅读器会跳过该校验步骤,直接尝试解码图像数据,因此能正常显示。
2. FFmpeg生成无损JPEG的方法
普通JPEG(Baseline)本身是有损压缩标准,要生成符合DICOM无损要求的JPEG,需使用FFmpeg的专属无损JPEG编码器,具体命令如下:
ffmpeg -i videofile.mp4 -r desired_framerate -c:v ljpeg tmp_04%d.jpeg
-c:v ljpeg指定使用LJPEG无损编码器,生成的图像完全符合DICOM无损传输语法的要求。- 注意:
-q:v参数对无损JPEG无效,因为无损压缩不存在画质损失的调整空间。
也可以用mjpeg编码器配合无损参数实现,但兼容性不如ljpeg直接,命令示例:
ffmpeg -i videofile.mp4 -r desired_framerate -c:v mjpeg -qscale:v 0 tmp_04%d.jpeg
内容的提问来源于stack exchange,提问作者PizzaPasNette
相关产品推荐
相关产品推荐

