我需要编写一个应用程序来播放DICOM多帧图像。每帧都以JPEG格式存储。所有帧都连续存储在一个文件中。现在,我读出每个帧数据并将其传递给以下例程,以构建一个用于显示的位图:
Bitmap CreateBitmap(byte[] pixelBuffer, int frameSize)
{
Bitmap image = null;
try
{
long startTicks = DateTime.Now.Ticks;
MemoryStream pixelStream = new MemoryStream(pixelBuffer, 0, frameSize);
image = new Bitmap(pixelStream);
loadTime = DateTime.Now.Ticks - startTicks;
}
catch (Exception ex)
{
Log.LogException(ex);
}
return image;
}
在测试期间,除了上述例程中的性能不是最佳之外,一切正常。对于800x600帧大小,此例程所需的时间为0毫秒和15毫秒(我不知道为什么)。对于1024x768帧大小,所需时间为15毫秒或31毫秒。我的目标是流式传输图像数据并以60Hz的频率播放图像(1024x768版本)而不丢帧。这表明我必须在15毫秒内不断地解压缩JPEG帧。所以我的问题是更好的方法是什么?
答案 0 :(得分:6)
它是0毫秒或15毫秒,因为你的计时器缺乏分辨率。使用QueryPerformanceCounter
获取准确的时间。
WPF JPEG解码器(System.Windows.Media.Imaging
)比GDI +解码器更快。
答案 1 :(得分:2)
我意识到您可能有限制规定JPEG帧要求,但最好的方法是使用为视频设计的不同格式,如MEPG或Quicktime。将您的JPEG帧转换为专为流式传输和流式传输而设计的视频格式。
答案 2 :(得分:2)
好的,我想出了如何在方法中使用System.Windows.Media.Imaging.JpegBitmapEncoder:
JpegBitmapDecoder decoder = new JpegBitmapDecoder(pixelStream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapFrame frame = decoder.Frames[0];
frame.CopyPixels(pixelBuffer, stride, 0);
我测量了性能,似乎有100%的改进。来自WIC和WPF的不错的工作。现在将1024x768图像解码到9到10毫秒。
答案 3 :(得分:0)
您可以尝试使用Windows成像组件WIC。这可能是WPF在幕后使用的,在另一个答案中提出。