2012-11-20 43 views

回答

3

這可以通過一個extension method解決:

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Windows.Media.Imaging; 

/// <remarks> 
/// Requires reference to <c>System.Drawing</c>, <c>PresentationCore</c> and <c>WindowsBase</c>. 
/// </remarks> 
public static class JpegXr { 

    public static MemoryStream SaveJpegXr(this Bitmap bitmap, float quality) { 
     var stream = new MemoryStream(); 
     SaveJpegXr(bitmap, quality, stream); 
     stream.Seek(0, SeekOrigin.Begin); 
     return stream; 
    } 

    public static void SaveJpegXr(this Bitmap bitmap, float quality, Stream output) { 
     var bitmapSource = bitmap.ToWpfBitmap(); 
     var bitmapFrame = BitmapFrame.Create(bitmapSource); 
     var jpegXrEncoder = new WmpBitmapEncoder(); 
     jpegXrEncoder.Frames.Add(bitmapFrame); 
     jpegXrEncoder.ImageQualityLevel = quality/100f; 
     jpegXrEncoder.Save(output); 
    } 

    /// <seealso cref="http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap"/> 
    public static BitmapSource ToWpfBitmap(this Bitmap bitmap) { 
     using (var stream = new MemoryStream()) { 
      bitmap.Save(stream, ImageFormat.Bmp); 
      stream.Position = 0; 
      var result = new BitmapImage(); 
      result.BeginInit(); 
      // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed." 
      // Force the bitmap to load right now so we can dispose the stream. 
      result.CacheOption = BitmapCacheOption.OnLoad; 
      result.StreamSource = stream; 
      result.EndInit(); 
      result.Freeze(); 
      return result; 
     } 
    } 

}