2

How can I encode a System.Drawing.Bitmap (v4.0) to the JPEG XR stream?

4

1 回答 1

3

这可以通过扩展方法解决:

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;
        }
    }

}
于 2012-11-20T11:57:26.290 回答