在C#中解压缩JPEG图像的最快方法是什么?

时间:2009-11-19 18:39:14

标签: c# windows winforms performance

我需要编写一个应用程序来播放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帧。所以我的问题是更好的方法是什么?

4 个答案:

答案 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在幕后使用的,在另一个答案中提出。