Как преобразовать изображение в ImageSource

Я не знаю, правильно ли я задаю вопрос; так что заранее извиняюсь. Я пишу несколько PNG на холст, и я также хочу одновременно скопировать PNG в растровое изображение. Я хочу, чтобы PNG отображались в тех же местах на растровом изображении, что и на холсте.

Это фрагмент кода:

WorkingBMP = new RenderTargetBitmap(BOARD_WIDTH, BOARD_HEIGHT, 96, 96, PixelFormats.Pbgra32);

TreeFile = "pack://application:,,,/Images/" + TreeFile;

var image = new Image
{
    Source = new BitmapImage(new Uri(TreeFile))
};
image.Width = 10;
image.Height = 10;

Canvas.SetLeft(image, x );
Canvas.SetTop(image, y );

DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawImage(image, new Rect(x, y, image.Width, image.Height));
drawingContext.Close();

WorkingBMP.Render(drawingVisual);

MainCanvas.Children.Add(image);

ОДНАКО, он выдает ошибку «невозможно преобразовать из« System.Windows.Controls.Image »в« System.Windows.Media.ImageSource »в этой строке:

drawingContext.DrawImage(image,
                  new Rect(x, y, image.Width, image.Height));

Будет ли эта ошибка решена, если я смогу каким-то образом преобразовать изображение в ImageSource, или я все делаю неправильно?

Спасибо!


person zetar    schedule 03.03.2017    source источник
comment
В приведенном выше коде вы создаете BitmapImage объект, который является ImageSource (стандартная замена ООП/Лисков/и т. д.). Почему бы вам просто не использовать этот объект? Почему вы пытаетесь преобразовать элемент пользовательского интерфейса WPF во что-то другое?   -  person Peter Duniho    schedule 03.03.2017


Ответы (3)


Если BitmapImage нарисован напрямую, он должен работать

var source = new BitmapImage(new Uri(TreeFile))

drawingContext.DrawImage(source,
                  new Rect(x, y, image.Width, image.Height));
person Arsen Mkrtchyan    schedule 03.03.2017
comment
Спасибо! Очень признателен! - person zetar; 03.03.2017

Image — это элемент управления в окне. Image.Source — это фактическое растровое изображение, которое Image извлекает для рендеринга. Это может быть неочевидно, но ваш код как бы намекает на это, потому что вы устанавливаете Source в свой BitmapImage.

Вам нужно использовать исходное свойство, чтобы получить фактическое BitmapImage, которое вы создали.

Возможно, вам придется выполнить кастинг, но это должно сработать:

drawingContext.DrawImage(image.Source,
                  new Rect(x, y, image.Width, image.Height));
person TyCobb    schedule 03.03.2017
comment
Спасибо, что объяснили это! - person zetar; 03.03.2017

Здесь Попробуйте это

WorkingBMP = new RenderTargetBitmap(BOARD_WIDTH, BOARD_HEIGHT, 96, 96, PixelFormats.Pbgra32);

TreeFile = "pack://application:,,,/Images/" + TreeFile;

var image = new Image
{
    Source = new BitmapImage(new Uri(TreeFile))
};
image.Width = 10;
image.Height = 10;

Canvas.SetLeft(image, x );
Canvas.SetTop(image, y );

DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawImage(new BitmapImage(new Uri(TreeFile)), new Rect(x, y, image.Width, image.Height));
drawingContext.Close();

WorkingBMP.Render(drawingVisual);

MainCanvas.Children.Add(image);
person CaptainHere    schedule 03.03.2017