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

5

我需要编写一个应用程序来播放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个回答

6

定时器的分辨率不够,所以时间为0毫秒或15毫秒。使用QueryPerformanceCounter获取准确时间。

WPF JPEG解码器(System.Windows.Media.Imaging)比GDI+解码器快。


и°ўи°ўпјҒдҪ иғҪз»ҷжҲ‘дёҖдёӘдҫӢеӯҗпјҢеұ•зӨәеҰӮдҪ•з»ҳеҲ¶JpegBitmapDecoderиҝ”еӣһзҡ„BitmapFrameеҗ—пјҹжҲ‘дёҚиғҪеҶҚеңЁOnPaint()дёӯдҪҝз”ЁGraphics.DrawImage()дәҶгҖӮ - JohnY
使用GDI+绘制WPF图像会很麻烦。如果您必须呈现到WinForms,则应坚持使用GDI+类。 - Frank Krueger

3

我知道您可能有JPEG帧的限制要求,但最好的方法是使用一种专门用于视频的不同格式,如MEPG或Quicktime。将您的JPEG帧转换为专门设计用于流媒体传输的视频格式,并进行流式传输。


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毫秒。


0
你可以尝试使用Windows图像组件WIC。这可能是WPF在幕后使用的,正如另一个答案中所建议的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接