2012-11-15 1 views
3

아래 코드를 사용하여 비트 맵을 jpeg로 변환합니다. 비트 맵은 300dpi (가로/세로 해상도)로 전달되지만 CreateBitmapSourcefromHBitmap 메서드는 후속 jpeg가 항상 96dpi로 저장되도록 변경합니다.비트 맵에서 JPEG로 변환하고 원본 비트 맵 해상도 유지

원래 300dpi를 유지하기 위해 원본을 설정할 수있는 방법이 있습니까? dpiX 및 dpiY 값은 읽기 전용입니다.

미리 감사드립니다.

public static MemoryStream GetJpgMemoryStream(Bitmap bitMap, int jpgQuality) 
{ 
    IntPtr hBitmap = bitMap.GetHbitmap(); 

    try 
    {  

     BitmapSource source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 

     var jpegBitmapEncoder = new JpegBitmapEncoder(); 

     jpegBitmapEncoder.QualityLevel = jpgQuality; 
     jpegBitmapEncoder.Frames.Add(BitmapFrame.Create(source)); 

     var jpegStream = new MemoryStream(); 

     jpegBitmapEncoder.Save(jpegStream); 

     jpegStream.Flush(); 


     return jpegStream; 

    } 
} 

답변

0

MSDN Forum에 대한 문제는 해당 문제와 유사합니다. 권장되는 대답은 Interop을 사용하지 않고 대신 WriteableBitmapBitmapSource으로 사용하는 것입니다.

0

BitmapSource 생성 방법을 변경해야합니다. BitmapSource 생성에 fast converting Bitmap to BitmapSource wpf에 설명 된 방법을 사용할 수 있습니다. 다음은 업데이트 된 코드입니다.

BitmapData data = bitMap.LockBits( 
         new System.Drawing.Rectangle(0,0,bitMap.Width,bitMap.Height), 
         System.Drawing.Imaging.ImageLockMode.ReadOnly, 
         bitMap.PixelFormat); 

    BitmapSource source = BitmapSource.Create(bitMap.Width, bitMap.Height, 
           bitMap.HorizontalResolution, bitMap.VerticalResolution, 
           System.Windows.Media.PixelFormats.Bgr24, null, 
           data.Scan0, data.Stride*bitMap.Height, data.Stride); 

    bitMap.UnlockBits(data); 

    var jpegBitmapEncoder = new JpegBitmapEncoder(); 

    jpegBitmapEncoder.QualityLevel = jpgQuality; 
    jpegBitmapEncoder.Frames.Add(BitmapFrame.Create(source)); 

    var jpegStream = new MemoryStream(); 

    jpegBitmapEncoder.Save(jpegStream);