Все ваши кодировщики используют класс 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 в качестве параметра общего типа.
Надеюсь, это поможет.