有没有办法可以在UserControl.OnPaint()方法中使用从JpegBitmapDecoder返回的BitmapFrame?有人告诉我,Systems.Windows.Media.Imaging的JPEG解码性能远远优于Systems.Windows.Forms库使用的GDI +。但是,我的应用程序已经使用Systems.Windows.Forms库编写,我不想更改所有内容。我只需要一种更快速的方法来解压缩JPEG帧并在OnPaint()方法中绘制它。
答案 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项目中使用它,请添加以下引用:
然后调用此方法:
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;
}