You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多帧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。

核心问题:

  1. 为何部分阅读器可正常显示该Dicom文件,而部分不行?
  2. 是否存在通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:33:09