Главная » WPF » Создание  изображений

0

Обычно источником изображений служит цифровая камера или графический редактор, но иногда приходится  создавать  их динамически.  Это бывает полезно по двум причинам: (1) для повышения производительности (единожды сгенери ровать  сложное  изображение с помощью  векторов  и различных эффектов, а не показывать  всякий  раз растр)  или (2)  для публикации (так, все изображения в этой книге были сгенерированы с помощью WPF  приложений).

Для генерации  растрового  изображения можно воспользоваться одним из классов   RenderTargetBitmap  или  WritableBitmap.  Класс   RenderTargetBitmap

позволяет  вывести любой визуальный элемент в растровое изображение фикси рованного размера. Создав растр, мы можем либо сохранить его в файле, приме нив один из многочисленных кодировщиков изображений, или вывести на экран (класс  RenderTargetBitmap также  наследует  ImageSource). С  другой  стороны, класс WritableBitmap позволяет  редактировать пиксели в самом изображении. Давайте  определим  набор элементов: поле обогащенного  текста, кнопку  слева и изображение справа. При нажатии кнопки мы создадим из текстового поля изоб ражение и выведем его на экран. Интересно будет сравнить это упражнение с тем, что мы раньше делали с помощью кисти VisualBrush. Напомним,  что VisualBrush

– «живая»  копия  части пользовательского интерфейса, тогда как на этот раз мы создаем статический снимок части экрана в виде набора пикселей  (рис. 5.25):

<!— CreateImages.xaml —>

<Window x:Class=’EssentialWPF.CreateImages’ xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’ xmlns:x=’http://schemas.microsoft.com/winfx/2006/xaml’ Title=’Create Images’

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width=’*’ />

<ColumnDefinition Width=’*’ />

</Grid.ColumnDefinitions>

<DockPanel>

<Button DockPanel.Dock=’Bottom’ Click=’Copy’>Copy</Button>

<RichTextBox FontSize=’24pt’ Name=’_textBox’ />

</DockPanel>

<Image Grid.Column=’1’ Name=’_display’ />

</Grid>

</Window>

// CreateImages.xaml.cs

void Copy(object sender, RoutedEventArgs e) { RenderTargetBitmap bmp =

new RenderTargetBitmap( (int)_textBox.ActualWidth, // размеры (int)_textBox.ActualHeight,

96, 96, // разрешение

PixelFormats.Pbgra32); // 32 бита, Alpha+RGB

// Вывести _textBox в это изображение. bmp.Render(_textBox);

_display.Source = bmp;

}

При желании  извлечь это изображение и сохранить его мы можем воспользо ваться  кодировщиком. В  данном  случае  закодируем   изображение в  формате JPEG.  Отметим,  что изображения необходимо добавлять  в виде кадров:

void Copy(object sender, RoutedEventArgs e) { RenderTargetBitmap bmp =

new RenderTargetBitmap( (int)_textBox.ActualWidth, // ??????? (int)_textBox.ActualHeight,

96, 96, // ??????????

PixelFormats.Pbgra32); // 32 ????, Alpha+RGB

// ??????? _textBox ? ??? ???????????. bmp.Render(_textBox);

_display.Source = bmp;

JpegBitmapEncoder encoder = new JpegBitmapEncoder();

encoder.Frames.Add(BitmapFrame.Create(bmp));

using (FileStream o = File.Open(@»c:\out.jpg», FileMode.Create)) {

encoder.Save(o);

}

}

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии