簡體   English   中英

在C#中解壓縮JPEG圖像的最快方法是什么?

[英]What's the fastest way to decompress JPEG images in C#

我需要編寫一個應用程序來播放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毫秒或15毫秒,因為你的計時器缺乏分辨率。 使用QueryPerformanceCounter獲取准確的時間。

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

我意識到你可能有限制規定JPEG幀要求,但最好的方法是使用為視頻設計的不同格式,如MEPG或Quicktime。 將您的JPEG幀轉換為專為流式傳輸和流式傳輸而設計的視頻格式。

好的,我想出了如何在方法中使用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毫秒。

您可以嘗試WIC,即Windows成像組件。 這可能是WPF在幕后使用的,在另一個答案中提出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM