WPF Обрезка источника изображения в DrawingVisual
Мне нужно отобразить обрезанную область источника изображения в DrawingVisual, но за последние несколько часов я просто нарисовал пустые места для простой задачи.
Мой план состоит в том, чтобы реализовать временную анимацию (для системы HMI), которая будет делать большое изображение, содержащее различные кадры. В зависимости от переменной состояния DrawingVisual будет извлекать из этого большого изображения текущий кадр для показа - следовательно, необходимо обрезать.
Мой код выглядит следующим образом:
int width = Convert.ToInt32(_imageSource.Width / 2);
int height = Convert.ToInt32(_imageSource.Height);
BitmapImage bm = _imageSource.Clone() as BitmapImage;
bm.BaseUri = BaseUriHelper.GetBaseUri(this);
CroppedBitmap c = new CroppedBitmap(bm, new Int32Rect(0, 0, width, height));
ImageDrawing id = new ImageDrawing(c, new Rect(0, 0, width, height));
dg.Children.Add(id);
dc.DrawDrawing(dg);
Однако при создании обрезанного изображения я получаю
"значение не попадает в ожидаемый диапазон"
Кстати, изображение представляет собой png, загруженный в словарь ресурсов (в текущей сборке) как
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<BitmapImage x:Key="elbowSmallBlueBL" UriSource="./Assets/HMI/Elbows/Small/Elbow Blue BottomLeft.png" />
а затем присваивается DrawingVisual с помощью (ImageSource)FindResource("...
Во-первых, я не понимаю сообщение об ошибке и нигде не могу найти удовлетворительного объяснения, а во-вторых, почему так сложно выполнить простую задачу?
Спасибо за любую помощь.
ps я думаю это из-за невозможности найти ресурс. Но если исходный источник изображений в порядке, почему клонированная версия будет вести себя иначе? pps Удаление строки "bm.BaseUri =..." приводит к той же ошибке.
Чтобы упростить задачу, я создал тестовый проект, в котором есть только кнопка, которая пытается создать CroppedBitmap при нажатии.
Нажатие кнопки =
private void Button_Click(object sender, RoutedEventArgs e)
{
BitmapSource i = (BitmapSource)FindResource("elbowSmallBlueBL");
try
{
CroppedBitmap c = new CroppedBitmap(i, new Int32Rect(0, 0, 100, 100));
}
catch (Exception ex)
{
}
}
}
Словарь ресурсов ссылается на растровое изображение:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Elbows -->
<BitmapImage x:Key="elbowSmallBlueBL" UriSource="./Assets/HMI/Elbows/Small/Elbow Blue BottomLeft.png" />
и включил App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="rdHMIControls.xaml" />
BitmapSource (i) является действительным, и вызов CroppedBitmap вызывает исключение ArgumentException, "Значение не попадает в допустимый диапазон".
Создание или попытка создать обрезанное изображение не может быть проще, чем это?
Еще один пример, который я снял с MSDN
BitmapSource i = (BitmapSource)this.FindResource("test");
try
{
// Create an Image element.
Image croppedImage = new Image();
croppedImage.Width = 200;
croppedImage.Margin = new Thickness(5);
// Create a CroppedBitmap based off of a xaml defined resource.
CroppedBitmap cb = new CroppedBitmap(
i,
new Int32Rect(30, 20, 105, 50)); //select region rect
croppedImage.Source = cb; //set image source to cropped
Снова новый CroppedBitmap выдает InvalidArgument кроме
Какие-нибудь мысли?
Спасибо