如何更改图像文件格式

时间:2015-01-09 11:30:19

标签: c# image image-conversion image-formats

我想编写一个应用程序,将图像(jpeg,png,tiff,gif,...)作为流并将其转换为jrx(jpeg xr),并进行无损压缩。

这就是我迄今为止所尝试过的,没有可用的结果:

using System.Windows.Media.Imaging;
    //decode jpg
    public static BitmapSource ReadJpeg(Stream imageStreamSource)
    {
        JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];
        return bitmapSource;
    }
    //encode
    public static Stream Encode(BitmapSource image)
    {
        WmpBitmapEncoder encoder = new WmpBitmapEncoder();
        MemoryStream s = new MemoryStream();
        encoder.Frames.Add(BitmapFrame.Create(image));
        encoder.Save(s);
        return s;
    }

有人能指出我正确的方向吗?我现在在这里待了一段时间。

如果您需要更多信息,请询问。

System.Drawing.Bitmap to JPEG XR适用于给定的输入格式,但并未完全覆盖我的问题,因为缺少解码图像的部分。

谢谢大家指出我正确的方向! 我现在知道,如何继续。

1 个答案:

答案 0 :(得分:-2)

试试这个:

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


    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();


            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();
            return result;
        }
    }