Сохранение объекта TransformedBitmap на диск. - PullRequest
1 голос
/ 07 сентября 2010

Работая в WPF и C #, у меня есть объект TransformedBitmap, который я либо:

  1. Нужно сохранить на диск как файл растрового типа (в идеале, я позволю пользователям выбирать, будет ли онсохранены как BMP, JPG, TIF и т. д., однако, я еще не на этом этапе ...)
  2. Необходимо преобразовать в объект BitmapImage, поскольку я знаю, как получить байт [] изОбъект BitmapImage.

К сожалению, на данный момент я действительно изо всех сил пытаюсь выполнить любую из этих двух вещей.

Может ли кто-нибудь предложить какую-либо помощь или указать какие-либо методы, которые я мог бы пропустить?

1 Ответ

4 голосов
/ 07 сентября 2010

Все ваши кодировщики используют класс BitmapFrame для создания фреймов, которые будут добавлены в Frames свойство collection кодера. Метод 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 в качестве параметра общего типа.

Надеюсь, это поможет.

...