2009-11-20 1 views
0

UserControl.OnPaint() 메서드에서 JpegBitmapDecoder에서 반환 된 BitmapFrame을 사용할 수 있습니까? Systems.Windows.Forms 라이브러리에서 사용하는 GDI +보다 Systems.Windows.Media.Imaging에서 JPEG 디코딩의 성능이 훨씬 우수하다고 들었습니다. 그러나 내 응용 프로그램은 이미 Systems.Windows.Forms 라이브러리로 작성되었으며 모든 것을 변경하고 싶지 않습니다. 내가 필요로하는 것은 JPEG 프레임을 압축 해제하고 OnPaint() 메소드로 그릴 수있는보다 빠른 방법입니다.Systems.Windows.Forms.UserControl에서 JpegBitmapDecoder를 사용하는 방법

답변

0

나는 대답을 직접 알아 냈다. 다음은 샘플 코드입니다.

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

pixelBuffer는 사전 할당 된 바이트 배열입니다. 그리고 나서 그것을 사용하여 OnPaint()에서 비트 맵을 생성 할 수 있습니다.

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; 
} 
관련 문제