将TransformedBitmap对象保存到磁盘。

时间:2010-09-07 13:27:30

标签: c# wpf image bitmap save

在WPF和C#中工作,我有一个TransformedBitmap对象,我要么:

  1. 需要保存到磁盘作为位图类型的文件(理想情况下,我会允许用户选择是否将其保存为BMP,JPG,TIF等,但是,我还没到那个阶段...... )
  2. 需要转换为BitmapImage对象,因为我知道如何从BitmapImage对象获取byte []。
  3. 不幸的是,在这一点上,我真的很难完成这两件事中的任何一件。

    任何人都可以提供任何帮助或指出我可能遗失的任何方法吗?

1 个答案:

答案 0 :(得分:4)

所有编码器都使用BitmapFrame类来创建将添加到编码器的Frames集合属性的帧。 BitmapFrame.Create方法有多种重载,其中一种接受BitmapSource类型的参数。因此,我们知道TransformedBitmap继承自BitmapSource,我们可以将其作为参数传递给BitmapFrame.Create方法。以下是您所描述的方法:

public bool WriteTransformedBitmapToFile<T>(BitmapSource bitmapSource, string fileName) where T : BitmapEncoder, new()
        {
            if (string.IsNullOrEmpty(fileName) || bitmapSource == null)
                return false;

            //creating frame and putting it to Frames collection of selected encoder
            var frame = BitmapFrame.Create(bitmapSource);
            var encoder = new T();
            encoder.Frames.Add(frame);
            try
            {
                using (var fs = new FileStream(fileName, FileMode.Create))
                {
                    encoder.Save(fs);
                }
            }
            catch (Exception e)
            {
                return false;
            }
            return true;
        }

        private BitmapImage GetBitmapImage<T>(BitmapSource bitmapSource) where T : BitmapEncoder, new()
        {
            var frame = BitmapFrame.Create(bitmapSource);
            var encoder = new T();
            encoder.Frames.Add(frame);
            var bitmapImage = new BitmapImage();
            bool isCreated;
            try
            {
                using (var ms = new MemoryStream())
                {
                    encoder.Save(ms);
                    ms.Position = 0;

                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = ms;
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImage.EndInit();
                    isCreated = true;
                }
            }
            catch
            {
                isCreated = false;
            }
            return isCreated ? bitmapImage : null;
        }

他们接受任何BitmapSource作为第一个参数,并接受任何BitmapEncoder作为泛型类型参数。

希望这有帮助。