我需要写一个应用程序来播放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毫秒。我的目标是在不丢帧的情况下,以60 to的频率流式传输图像数据并播放图像(1024x768版本)。这意味着我必须不断地在15毫秒内解压JPEG帧。所以我的问题是,什么是更好的方法?
发布于 2009-11-20 02:42:54
它是0毫秒或15毫秒,因为你的计时器缺乏分辨率。使用QueryPerformanceCounter
获取准确的时间。
WPF JPEG解码器(System.Windows.Media.Imaging
)比GDI+解码器更快。
发布于 2009-11-20 02:43:37
我知道您可能有JPEG帧要求的限制,但最好的方法是使用为视频设计的不同格式,如MEPG或Quicktime。将JPEG帧转换为专为流式传输而设计的视频格式,并将其流式传输。
发布于 2009-12-12 07:43:20
好了,我现在知道如何在方法中使用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毫秒。
https://stackoverflow.com/questions/1765588
复制相似问题