【问题标题】:How to change Image file formats [duplicate]如何更改图像文件格式[重复]
【发布时间】:2015-01-09 21:11:55
【问题描述】:

我想编写一个应用程序,将图像(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 适用于给定的输入格式,但没有完全涵盖我的问题,因为缺少解码图像的部分。

感谢大家为我指明正确的方向! 我现在知道了,如何进行。

【问题讨论】:

  • .NET 是否支持.jrx?从未听说过这种格式,我怀疑它是否受支持。我认为您需要编写代码来自己写出该图像。
  • 有什么问题?消息?结果?预期结果?
  • 什么是“无可用结果”? 会发生什么
  • WmpBitmapEncode 应该创建一个 .jxr 兼容的图像。这就是我从 msdn 和 wikipedia 中学到的。
  • 这里已经回答了这个问题:stackoverflow.com/questions/13469631/…

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


【解决方案1】:

试试这个:

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

【讨论】:

  • 好的,你基本上复制粘贴了一个已经存在的答案......直接指向答案会更有用。
  • 我已经试过了。我的编译器不知道 ToWpfBitmap()。
  • 这是一种扩展方法。在你的项目中包含这个类后,你可以像这样使用它:BitmapSource wmpBmpSource = myBitmap.ToWpfBitmap();
  • @sk_ 谢谢,我会再试一次。
  • 关于如何使用扩展方法的参考:msdn.microsoft.com/fr-fr/library/bb383977.aspx
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2021-05-31
  • 2021-01-02
  • 1970-01-01
  • 2014-01-21
  • 2015-08-20
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多