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 кроме

Какие-нибудь мысли?

Спасибо

0 ответов

Другие вопросы по тегам