Почему WPF значительно усложняет работу с изображениями? - PullRequest
3 голосов
/ 24 июня 2011

Раньше я мог делать это очень сильно только с объектами Bitmap и Graphics.Теперь, когда я использую WPF, единственное, что я могу сделать, это загрузить изображение, показать его и заставить танцевать вокруг глупого экрана.Почему они избавились от этих очень полезных инструментов.Они пытаются одурманить .Net?

Все, что я хочу сделать, это загрузить изображение из файла и разрезать его на две части.Это было легко с .Net 2.0 и System.Drawing.Но с WPF я бью кирпичную стену без использования какого-то очень кода низкого уровня.Я пытался работать с WriteableBitmap.Но, похоже, это не то, чего я хочу.Нет ли способа обернуть DrawingContext вокруг BitmapImage или что-то еще?

Скажите, пожалуйста, что WPF - это больше, чем HTML для приложений.Я ДЕЙСТВИТЕЛЬНО расстроен !!

Правки:

Кроме того, как же можно сохранить изображение в файл?

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Если вы хотите разрезать изображение на две части, почему бы не использовать класс CroppedBitmap?

Рассмотрим следующий XAML. Один источник BitmapImage, общий для двух CroppedBitmaps, каждый из которых показывает различные части источника.

 <Window.Resources>
    <BitmapImage x:Key="bmp" UriSource="SomeBitmap.jpg" />
</Window.Resources>

<StackPanel>
    <Image>
        <Image.Source>
            <CroppedBitmap Source="{StaticResource ResourceKey=bmp}">
                <CroppedBitmap.SourceRect>
                    <Int32Rect X="0" Y="0" Width="100" Height="100" />
                </CroppedBitmap.SourceRect>
            </CroppedBitmap>
        </Image.Source>
    </Image>
    <Image>
        <Image.Source>
            <CroppedBitmap Source="{StaticResource ResourceKey=bmp}">
                <CroppedBitmap.SourceRect>
                    <Int32Rect X="100" Y="150" Width="50" Height="50" />
                </CroppedBitmap.SourceRect>
            </CroppedBitmap>
        </Image.Source>
    </Image>
</StackPanel>

Обновление: , чтобы сделать что-то подобное в коде:

        var bitmapImage = new BitmapImage(new Uri(...));
        var sourceRect = new Int32Rect(10, 10, 50, 50);
        var croppedBitmap = new CroppedBitmap(bitmapImage, sourceRect);
0 голосов
/ 24 июня 2011

Возможно, вам лучше всего использовать TransformedBitmap. Загрузите ваше растровое изображение как BitmapSource, затем установите для свойства Transform значение, которое вы хотите преобразовать. У вас есть несколько вариантов преобразования здесь . Это позволяет вращать, винт, матрица и т. Д. Преобразования. Если вы хотите применить более одного, используйте TransformGroup и примените несколько преобразований одновременно.

Вы также можете использовать BitmapFrame.Create(...) для работы с преобразованным изображением подробнее.

Псевдокод:

var image = new BitmapSource(...); //Your image
var transformBitmap = new TransformedBitmap(image);
var transformBitmap.Transform = ..//Set your transform;
//optionally:
var frame = BitmapFrame.Create(transformBitmap);
0 голосов
/ 24 июня 2011

Ну, есть это http://www.nerdparadise.com/tech/csharp/wpfimageediting/

или, возможно, вы можете добавить ссылку на System.Drawing в свой проект, а затем выполнить редактирование так, как вам удобно.

...