System.Drawing.Bitmap为JPEG XR(System.Drawing.Bitma

2019-08-02 23:30发布

我如何能编码System.Drawing.Bitmap (V4.0)的JPEG XR流?

Answer 1:

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

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

}


文章来源: System.Drawing.Bitmap to JPEG XR
标签: .net jpeg-xr