首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Systems.Windows.Forms.UserControl中使用JpegBitmapDecoder

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

Stack Overflow用户
提问于 2009-11-20 14:13:31
回答 2查看 4.2K关注 0票数 0

有没有办法在UserControl.OnPaint()方法中使用从JpegBitmapDecoder返回的BitmapFrame?我被告知Systems.Windows.Media.Imaging的JPEG解码性能比Systems.Windows.Forms库使用的GDI+要好得多。但是,我的应用程序已经是用Systems.Windows.Forms库编写的,我不想改变所有的东西。我所需要的是一种更快的方法来解压缩JPEG帧并将其绘制在OnPaint()方法中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-12 07:36:05

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

代码语言:javascript
复制
JpegBitmapDecoder decoder = new JpegBitmapDecoder(pixelStream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapFrame frame = decoder.Frames[0];
frame.CopyPixels(pixelBuffer, stride, 0);

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-19 16:14:41

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

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

然后调用此方法:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1768644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档