如何在Systems.Windows.Forms.UserControl中使用JpegBitmapDecoder

时间:2009-11-20 06:13:31

标签: c# wpf winforms performance

有没有办法可以在UserControl.OnPaint()方法中使用从JpegBitmapDecoder返回的BitmapFrame?有人告诉我,Systems.Windows.Media.Imaging的JPEG解码性能远远优于Systems.Windows.Forms库使用的GDI +。但是,我的应用程序已经使用Systems.Windows.Forms库编写,我不想更改所有内容。我只需要一种更快速的方法来解压缩JPEG帧并在OnPaint()方法中绘制它。

2 个答案:

答案 0 :(得分:0)

我自己想出了答案。以下是示例代码:

JpegBitmapDecoder decoder = new JpegBitmapDecoder(pixelStream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapFrame frame = decoder.Frames[0];
frame.CopyPixels(pixelBuffer, stride, 0);

pixelBuffer是一个预分配的字节数组。然后我可以用它在OnPaint()中构造一个Bitmap。

答案 1 :(得分:0)

要在Windows.Forms项目中使用它,请添加以下引用:

  • WindowsBase.DLL
  • PresentationCore.DLL
  • System.Xaml.DLL

然后调用此方法:

protected static Bitmap JpegToBitmap(Stream jpg)
{
    JpegBitmapDecoder ldDecoder = new JpegBitmapDecoder(jpg, BitmapCreateOptions.None, BitmapCacheOption.None);
    BitmapFrame lfFrame = ldDecoder.Frames[0];
    Bitmap lbmpBitmap = new Bitmap(lfFrame.PixelWidth, lfFrame.PixelHeight);
    Rectangle lrRect = new Rectangle(0, 0, lbmpBitmap.Width, lbmpBitmap.Height);
    BitmapData lbdData = lbmpBitmap.LockBits(lrRect, ImageLockMode.WriteOnly, (lfFrame.Format.BitsPerPixel == 24 ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb));
    lfFrame.CopyPixels(System.Windows.Int32Rect.Empty, lbdData.Scan0, lbdData.Height * lbdData.Stride, lbdData.Stride);
    lbmpBitmap.UnlockBits(lbdData);

    return lbmpBitmap;
}