Общие сведения об обработке изображений

Обновлен: Ноябрь 2007

Данный раздел представляет собой введение в Компонент обработки изображений Microsoft Windows Presentation Foundation. Обработка изображений WPF позволяет разработчикам отображать, преобразовывать и форматировать изображения.

В этом разделе содержатся следующие подразделы.

  • Компонент WPF Imaging
  • Форматы изображений в WPF
  • Отображение изображений в WPF
  • Метаданные изображений
  • Расширяемость кодека
  • Связанные разделы

Компонент WPF Imaging

Обработка изображений WPF предоставляет значительные усовершенствования возможностей обработки изображений в Microsoft Windows. Функции работы с изображениями, например вывод растрового изображения или использование изображения в обычных элементах управления, были ранее реализованы в библиотеках Интерфейс графических устройств (GDI) Microsoft Windows и Microsoft Windows GDI+. Эти интерфейсы API-интерфейс обеспечивают базовые функции для работы с изображениями, однако не обеспечивают поддержку расширяемости кодеков и изображений высокого разрешения. При разработке библиотеки Обработка изображений WPF были учтены недостатки библиотек Интерфейс GDI и GDI+; в нее был включен новый набор интерфейсов API-интерфейс для вывода и использования изображений в приложениях.

Существует два способа доступа к Обработка изображений WPFAPI-интерфейс — управляемому компоненту и неуправляемому компоненту. Неуправляемый компонент предоставляет следующие возможности.

  • Расширяемость для новых или собственных форматов изображений.

  • Улучшенная производительность и повышенный уровень безопасности для собственных форматов изображений, включая BMP (bitmap — точечный рисунок), Формат JPEG (Joint Photographics Experts Group), Формат PNG (Portable Network Graphics), Формат TIFF (Tagged Image File Format), Microsoft Windows Media Photo, Формат GIF (Graphics Interchange Format) и значков (ICO).

  • Сохранение данных изображения с высокой глубиной цвета до 32 бит на канал.

  • Неразрушающее масштабирование, обрезка и повороты.

  • Упрощенное управление цветом.

  • Поддержка собственных метаданных в файле.

  • Управляемый компонент использует неуправляемую инфраструктуру для предоставления плавной интеграции изображений с другими возможностями WPF, например, пользовательский интерфейс, анимацией и графикой. Управляемый компонент также использует преимущества модели расширяемости кодека для работы с изображениями WPF (Windows Presentation Foundation), которая позволяет автоматически распознавать новые форматы изображений в приложениях WPF.

Большинство управляемых Обработка изображений WPFAPI-интерфейс находятся в пространстве имен System.Windows.Media.Imaging, несмотря на то что несколько важных типов, таких как ImageBrush и ImageDrawing находятся в пространстве имен System.Windows.Media, а Image находится в пространстве имен System.Windows.Controls.

В этом разделе содержится дополнительная информация об управляемом компоненте. Дополнительные сведения о неуправляемых интерфейсах API-интерфейс см. в документации к Неуправляемому WPF-компоненту для работы с изображениями.

Форматы изображений в WPF

Кодек используется для кодирования и раскодирования конкретного мультимедиа-формата. Обработка изображений WPF включает кодеки для форматов BMP, JPEG, Формат PNG, TIFF, Windows Media Photo, GIF и значков. Каждый из этих кодеков позволяет приложениям декодировать и кодировать (за исключением значков) соответствующие им форматы изображений.

BitmapSource является важным классом, используемым для декодирования и кодирования изображений. Этот основной строительный блок конвейера Обработка изображений WPF представляет отдельный, постоянный набор точек определенного размера и разрешения. BitmapSource может быть отдельным фреймом многокадрового изображения или результатом преобразования, выполненного с BitmapSource. Он является родителем многих основных классов, используемых при обработке изображений WPF, таких как BitmapFrame.

BitmapFrame используется для хранения растровых данных формата изображения. Большинство форматов изображений поддерживают один BitmapFrame, хотя форматы, такие как GIF и TIFF, поддерживают несколько фреймов на изображение. Фреймы используются декодерами в качестве входных данных и передаются кодировщикам для создания файлов изображений.

В следующем примере показано создание BitmapFrame из BitmapSource и добавление его к изображению TIFF.

Dim image5 As BitmapSource = System.Windows.Media.Imaging.BitmapSource.Create(width, height, 96, 96, PixelFormats.Indexed1, BitmapPalettes.WebPalette, pixels, stride)

Dim stream5 As New FileStream("palette.tif", FileMode.Create)
Dim encoder5 As New TiffBitmapEncoder()
encoder5.Frames.Add(BitmapFrame.Create(image5))
encoder5.Save(stream5)
BitmapSource image5 = BitmapSource.Create(
    width,
    height,
    96,
    96,
    PixelFormats.Indexed1,
    BitmapPalettes.WebPalette,
    pixels,
    stride);

FileStream stream5 = new FileStream("palette.tif", FileMode.Create);
TiffBitmapEncoder encoder5 = new TiffBitmapEncoder();
encoder5.Frames.Add(BitmapFrame.Create(image5));
encoder5.Save(stream5);

Декодирование форматов изображения

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

В следующем примере показано использование декодера точечных рисунков для декодирования формата изображения BMP.

' Open a Uri and decode a BMP image
Dim myUri As New Uri("tulipfarm.bmp", UriKind.RelativeOrAbsolute)
Dim decoder2 As New BmpBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim bitmapSource2 As BitmapSource = decoder2.Frames(0)

' Draw the Image
Dim myImage2 As New Image()
myImage2.Source = bitmapSource2
myImage2.Stretch = Stretch.None
myImage2.Margin = New Thickness(20)
// Open a Uri and decode a BMP image
Uri myUri = new Uri("tulipfarm.bmp", UriKind.RelativeOrAbsolute);
BmpBitmapDecoder decoder2 = new BmpBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource2 = decoder2.Frames[0];

// Draw the Image
Image myImage2 = new Image();
myImage2.Source = bitmapSource2;
myImage2.Stretch = Stretch.None;
myImage2.Margin = new Thickness(20);

Кодирование формата изображения

Кодирование изображения является преобразованием данных изображения в определенный формат изображения. Зашифрованные данные изображения могут быть использованы для создания новых файлов изображений. Обработка изображений WPF предоставляет кодировщики для каждого из описанных выше форматов изображения.

В следующем примере показано использование кодировщика для сохранения вновь созданного точечного рисунка.

Dim stream As New FileStream("new.bmp", FileMode.Create)
Dim encoder As New BmpBitmapEncoder()
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString()
encoder.Frames.Add(BitmapFrame.Create(image))
encoder.Save(stream)
FileStream stream = new FileStream("new.bmp", FileMode.Create);
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
TextBlock myTextBlock = new TextBlock();
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);

Отображение изображений в WPF

Существует несколько способов отображения изображений в приложениях WPF (Windows Presentation Foundation). Изображения могут быть отображены с помощью элемента управления Image, нарисованы на визуальном объекте с помощью ImageBrush или начерчены с использованием ImageDrawing.

Использование элемента управления Image

Image — это элемент Framework, который является основным способом отображения рисунков в приложениях. В XAML существует два способа использования Image: в синтаксисе атрибута или свойства. В следующем примере показано отображение изображения шириной в 200 точек с помощью как синтаксиса атрибута, так и синтаксиса тега свойства. Дополнительные сведения о синтаксисе атрибута и синтаксисе свойства см. в разделе Общие сведения о свойствах зависимости.

<!-- Simple image rendering. However, rendering an image this way may not
     result in the best use of application memory. See markup below which
     creates the same end result but using less memory. -->
<Image Width="200" 
Source="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"/>

<Image Width="200">
  <Image.Source>
    <!-- To save significant application memory, set the DecodePixelWidth or  
     DecodePixelHeight of the BitmapImage value of the image source to the desired 
     height and width of the rendered image. If you don't do this, the application will 
     cache the image as though it were rendered as its normal size rather then just 
     the size that is displayed. -->
    <!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
         or DecodePixelHeight but not both. -->
    <BitmapImage DecodePixelWidth="200"  
     UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg" />
  </Image.Source>
</Image>

Во многих примерах объект BitmapImage используется для ссылки на файл изображения. BitmapImage является специализированным BitmapSource, который оптимизирован для загрузки Язык XAML (Extensible Application Markup Language) и предоставляет простой способ отображения изображений как Source элемента управления Image.

В следующем примере показано, как отобразить изображение шириной 200 точек с помощью кода.

ms748873.alert_note(ru-ru,VS.90).gifПримечание.

BitmapImage реализует интерфейс ISupportInitialize для оптимизации инициализации на нескольких свойствах. Изменения свойств могут возникать только во время инициализации объекта. Вызов BeginInit сигнализирует о том, что началась инициализация, а EndInit — о том, что инициализация завершена. После инициализации изменения свойств игнорируются.

' Create Image Element
Dim myImage As New Image()
myImage.Width = 200

' Create source
Dim myBitmapImage As New BitmapImage()

' BitmapImage.UriSource must be in a BeginInit/EndInit block
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg")

' To save significant application memory, set the DecodePixelWidth or  
' DecodePixelHeight of the BitmapImage value of the image source to the desired 
' height or width of the rendered image. If you don't do this, the application will 
' cache the image as though it were rendered as its normal size rather then just 
' the size that is displayed.
' Note: In order to preserve aspect ratio, set DecodePixelWidth
' or DecodePixelHeight but not both.
myBitmapImage.DecodePixelWidth = 200
myBitmapImage.EndInit()
'set image source
myImage.Source = myBitmapImage
// Create Image Element
Image myImage = new Image();
myImage.Width = 200;

// Create source
BitmapImage myBitmapImage = new BitmapImage();

// BitmapImage.UriSource must be in a BeginInit/EndInit block
myBitmapImage.BeginInit();
myBitmapImage.UriSource = new Uri(@"C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg");

// To save significant application memory, set the DecodePixelWidth or  
// DecodePixelHeight of the BitmapImage value of the image source to the desired 
// height or width of the rendered image. If you don't do this, the application will 
// cache the image as though it were rendered as its normal size rather then just 
// the size that is displayed.
// Note: In order to preserve aspect ratio, set DecodePixelWidth
// or DecodePixelHeight but not both.
myBitmapImage.DecodePixelWidth = 200;
myBitmapImage.EndInit();
//set image source
myImage.Source = myBitmapImage;

Вращение, преобразование и обрезка изображений

WPF позволяет пользователям осуществлять преобразования изображений с помощью свойств BitmapImage или с использованием дополнительных объектов BitmapSource, таких как CroppedBitmap или FormatConvertedBitmap. Эти преобразования могут масштабировать или вращать изображение, изменять формат точек или обрезать изображение.

Вращения изображения осуществляются с помощью свойства Rotation элемента BitmapImage. Вращения могут быть выполнены только с шагом 90 градусов. В следующем примере изображение повернуто на 90 градусов.

<Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1">
  <Image.Source>
    <TransformedBitmap Source="/sampleImages/watermelon.jpg" >
      <TransformedBitmap.Transform>
        <RotateTransform Angle="90"/>
      </TransformedBitmap.Transform>
    </TransformedBitmap>
  </Image.Source>
</Image>
<Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1">
  <Image.Source>
    <TransformedBitmap Source="/sampleImages/watermelon.jpg" >
      <TransformedBitmap.Transform>
        <RotateTransform Angle="90"/>
      </TransformedBitmap.Transform>
    </TransformedBitmap>
  </Image.Source>
</Image>
' Create Image element.
Dim rotated90 As New Image()
rotated90.Width = 150

' Create the TransformedBitmap to use as the Image source.
Dim tb As New TransformedBitmap()

' Create the source to use as the tb source.
Dim bi As New BitmapImage()
bi.BeginInit()
bi.UriSource = New Uri("sampleImages/watermelon.jpg", UriKind.RelativeOrAbsolute)
bi.EndInit()

' Properties must be set between BeginInit and EndInit calls.
tb.BeginInit()
tb.Source = bi
' Set image rotation.
Dim transform As New RotateTransform(90)
tb.Transform = transform
tb.EndInit()
' Set the Image source.
rotated90.Source = tb
// Create Image element.
Image rotated90 = new Image();
rotated90.Width = 150;

// Create the TransformedBitmap to use as the Image source.
TransformedBitmap tb = new TransformedBitmap();

// Create the source to use as the tb source.
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(@"sampleImages/watermelon.jpg", UriKind.RelativeOrAbsolute);
bi.EndInit();

// Properties must be set between BeginInit and EndInit calls.
tb.BeginInit();
tb.Source = bi;
// Set image rotation.
RotateTransform transform = new RotateTransform(90);
tb.Transform = transform;
tb.EndInit();
// Set the Image source.
rotated90.Source = tb;

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

<!-- Grayscale XAML Image -->
<Image Width="200" Grid.Column="0" Grid.Row="1">
   <Image.Source>
      <FormatConvertedBitmap Source="/sampleImages/rocks.jpg"  DestinationFormat="Gray4" />
   </Image.Source>
</Image>
'Create Image Element
Dim grayImage As New Image()
grayImage.Width = 200
grayImage.Margin = New Thickness(5)

'Create source using xaml defined resource.
Dim fcb As New FormatConvertedBitmap(CType(Me.Resources("masterImage"), BitmapImage), PixelFormats.Gray4, Nothing, 0)
'set image source
grayImage.Source = fcb
//Create Image Element
Image grayImage = new Image();
grayImage.Width = 200;
grayImage.Margin = new Thickness(5);

//Create source using xaml defined resource.
FormatConvertedBitmap fcb = new FormatConvertedBitmap(
   (BitmapImage)this.Resources["masterImage"],PixelFormats.Gray4,null,0);
//set image source
grayImage.Source = fcb;

Чтобы обрезать изображение, можно использовать либо свойство Clip элемента Image, либо CroppedBitmap. Как правило, если требуется отобразить лишь часть изображения, то следует использовать Clip. Если требуется закодировать и сохранить обрезанное изображения, то следует использовать CroppedBitmap. В следующем примере изображение обрезается с помощью свойства Clip, использующего EllipseGeometry.

<!-- Cropping an Image using Clip -->
<Image Width="200" Grid.Column="0" Grid.Row="5" Margin="5"
   Source="/sampleImages/gecko.jpg">
  <Image.Clip>
    <EllipseGeometry Center="75,50" RadiusX="50" RadiusY="25" />
  </Image.Clip>
</Image>
' Create the image for clipping
Dim clipImage As New Image()
clipImage.Width = 200
clipImage.Margin = New Thickness(5)

'Create & Set source
Dim bi As New BitmapImage()
' BitmapImage properties must be in a BeginInit/EndInit block
bi.BeginInit()
bi.UriSource = New Uri("pack://application:,,/sampleImages/gecko.jpg")
bi.EndInit()
clipImage.Source = bi

' Clip the using an EllipseGeometry
Dim clipGeometry As New EllipseGeometry(New System.Windows.Point(75, 50), 50, 25)
clipImage.Clip = clipGeometry
//Create the image for clipping
Image clipImage = new Image();
clipImage.Width = 200;
clipImage.Margin = new Thickness(5);

//Create & Set source
BitmapImage bi = new BitmapImage();
//BitmapImage.UriSource must be in a BeginInit/EndInit block
bi.BeginInit();
bi.UriSource = new Uri("pack://application:,,/sampleImages/gecko.jpg");
bi.EndInit();
clipImage.Source = bi;

//Clip the using an EllipseGeometry
EllipseGeometry clipGeometry = new EllipseGeometry(new Point(75, 50), 50, 25);
clipImage.Clip = clipGeometry;

Растягивание изображений

Свойство Stretch управляет растягиванием изображения для заполнения его контейнера. Свойство Stretch принимает следующие значения, определенные перечислением Stretch:

  • None: изображение не растягивается для заполнения выходной области. Если изображение больше, чем выходная область, то оно отображается в выходной области, при этом все, что не поместилось, отсекается.

  • Fill: изображение масштабируется по размеру выходной области. Поскольку высота и ширина изображения масштабируются независимо друг от друга, исходные пропорции изображения могут не сохраниться. Это означает, что изображение может деформироваться, чтобы полностью заполнить выходной контейнер.

  • Uniform: изображение масштабируется так, чтобы полностью помещаться в выходной области. При этом пропорции изображения сохраняются.

  • UniformToFill: изображение масштабируется таким образом, чтобы оно полностью заполняло выходную область. При этом сохраняются исходные пропорции изображения.

В следующем примере к Image применяется каждое из доступных перечислений Stretch.

На следующем рисунке показан результат примера и влияние различных параметров Stretch, примененных к изображению.

Различные параметры растяжения
Различные параметры растяжения TileBrush

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
  <DockPanel>

    <Border DockPanel.Dock="Top" Background="Black">
      <TextBlock Foreground="White" HorizontalAlignment="Stretch" FontSize="20">
        Stretching an Image
      </TextBlock>
    </Border>

    <Grid Name="simpleGrid" Background="{StaticResource CheckeredBrushResource}" 
       Margin="10" 
       ShowGridLines="True"
       VerticalAlignment="Center"
       HorizontalAlignment="Center">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="175" />
        <ColumnDefinition Width="175" />
        <ColumnDefinition Width="175" />
        <ColumnDefinition Width="175" />
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="200"/>
      </Grid.RowDefinitions>
      <!-- Labels -->
      <TextBlock Style="{StaticResource Header1}" 
        Grid.Column="0" Grid.Row="0">None</TextBlock>
      <TextBlock Style="{StaticResource Header1}" 
        Grid.Column="1" Grid.Row="0">Uniform</TextBlock>
      <TextBlock Style="{StaticResource Header1}" 
        Grid.Column="2" Grid.Row="0">UniformToFill</TextBlock>
      <TextBlock Style="{StaticResource Header1}"
        Grid.Column="3" Grid.Row="0">Fill</TextBlock>
      <Border Grid.Column="0" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
        <!-- None: Image is not scaled. If image is larger than the
             output area, the image will be cropped to the size of the output area.-->
        <Image
          Source="sampleImages/gecko.jpg" 
          Stretch="None" />
      </Border>
      <Border Grid.Column="1" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
        <!-- Uniform: Scale to fit output area.
             Aspect ratio is preserved.-->
        <Image
          Source="sampleImages/gecko.jpg" 
          Stretch="Uniform" />
      </Border>
      <Border Grid.Column="2" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
        <!-- UniformToFill: Scale to completely fill output area.
             Aspect ratio is preserved. Cropping may occur.-->
        <Image  
          Source="sampleImages/gecko.jpg" 
        Stretch="UniformToFill" />
      </Border>
      <Border Grid.Column="3" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
      <!-- Fill: Scale to completely fill output area.
             Aspect ratio may not be preserved.-->
      <Image 
        Source="sampleImages/gecko.jpg" 
        Stretch="Fill" />
      </Border>
    </Grid>
  </DockPanel>
</Page>

Рисование с помощью изображений

Изображения в приложении также могут быть нарисованы с помощью Brush. Кисти позволяют рисовать от простых одноцветных объектов Пользовательский интерфейс до объектов со сложными наборами шаблонов и изображений. Для рисования с помощью изображений следует использовать ImageBrush. ImageBrush является типом TileBrush, определяющим его содержимое как точечный рисунок. ImageBrush отображает одно изображение, которое задается его свойством ImageSource. Можно управлять растяжением, выравниванием и мозаичным заполнением изображения, что позволяет избегать искажений и создавать шаблоны и другие эффекты. На следующем рисунке показаны некоторые эффекты, которых можно добиться с помощью ImageBrush.

Кисти изображений могут закрашивать фигуры, элементы управления, текст и т.д.
Примеры вывода ImageBrush

В следующем примере показано, как использовать изображение в качестве фона кнопки с помощью ImageBrush.

<!-- Sets the button's Background property with an ImageBrush. The resulting
     button has an image as its background. -->
<Button Grid.Row="3" Grid.Column="2" 
 Height="75" Width="100" Foreground="White" FontWeight="Bold"
 HorizontalAlignment="Left">
  A Button
  <Button.Background>
    <ImageBrush ImageSource="sampleImages\blueberries.jpg" />
  </Button.Background>
</Button>

Дополнительные сведения о ImageBrush и рисовании с помощью изображений см. в разделе Рисование с помощью объектов Image, Drawing и Visual.

Метаданные изображений

Некоторые файлы изображений содержат метаданные, описывающие содержимое или характеристики файла. Например, большинство цифровых фотокамер создают изображения, содержащие метаданные об изготовителе и модели камеры, использованной для съемки изображения. Каждый формат изображения обрабатывает метаданные по-своему, но Обработка изображений WPF предоставляет универсальный способ хранения и извлечения метаданных для каждого поддерживаемого формата изображения.

Доступ к метаданным предоставляется через свойство Metadata объекта BitmapSource. Metadata возвращает объект BitmapMetadata, который включает все метаданные, содержащиеся в изображении. Эти данные могут содержаться в одной или нескольких схемах метаданных. Обработка изображений WPF поддерживает следующие схемы метаданных изображений: Файл формата EXIF (Exchangeable image file), tEXt ( текстовые данные PNG), IFD (image file directory — каталог файла изображения), IPTC (International Press Telecommunications Council — международный совет телекоммуникациям) и Платформа расширяемых метаданных (XMP).

Для упрощения процесса чтения метаданных BitmapMetadata предоставляет несколько именованных свойств, к которым можно легко получить доступ, например, Author, Title и CameraModel. Многие из этих именованных свойств могут также использоваться для записи метаданных. Дополнительная поддержка чтения метаданных обеспечивается считывателем запросов метаданных. Метод GetQuery используется для извлечения считывателя запросов метаданных с помощью строки запроса, например "/app1/exif/". В следующем примере GetQuery используется для получения текста, хранящегося в расположении "/Text/Description".

' Add the metadata of the bitmap image to the text block.
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "The Description metadata of this image is: " + pngInplace.GetQuery("/Text/Description").ToString()
// Add the metadata of the bitmap image to the text block.
TextBlock myTextBlock = new TextBlock();
myTextBlock.Text = "The Description metadata of this image is: " + pngInplace.GetQuery("/Text/Description").ToString();

Для записи метаданных используется средство записи запросов метаданных. SetQuery получает средство записи запросов и задает необходимое значение. В следующем примере SetQuery используется для записи текста, хранящегося в расположении "/Text/Description".

Dim pngStream As New System.IO.FileStream("smiley.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
Dim pngDecoder As New PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim pngFrame As BitmapFrame = pngDecoder.Frames(0)
Dim pngInplace As InPlaceBitmapMetadataWriter = pngFrame.CreateInPlaceBitmapMetadataWriter()
If pngInplace.TrySave() = True Then
    pngInplace.SetQuery("/Text/Description", "Have a nice day.")
End If
pngStream.Close()
Stream pngStream = new System.IO.FileStream("smiley.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
PngBitmapDecoder pngDecoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapFrame pngFrame = pngDecoder.Frames[0];
InPlaceBitmapMetadataWriter pngInplace = pngFrame.CreateInPlaceBitmapMetadataWriter();
if (pngInplace.TrySave() == true)
{ pngInplace.SetQuery("/Text/Description", "Have a nice day."); }
pngStream.Close();

Расширяемость кодека

Основной возможностью Обработка изображений WPF является модель расширяемости для новых кодеков изображений. Эти неуправляемые интерфейсы позволяют разработчикам кодеков интегрировать кодеки с WPF, чтобы автоматически использовать в приложениях WPF новые форматы изображений. Дополнительные сведения о неуправляемых интерфейсах Обработка изображений WPF см. в документации к Неуправляемому WPF-компоненту для работы с изображениями.

Пример расширения API-интерфейс см. в разделе Пример кодека Win32. В этом примере показано создание декодера и кодировщика пользовательского формата изображения.

ms748873.alert_note(ru-ru,VS.90).gifПримечание.

Для распознавания кодека системой он должен иметь цифровую подпись.

См. также

Задачи

Пример кодека Win32

Пример приложения "Фотомагазин"

Основные понятия

Оптимизация производительности: двумерная графика и обработка изображений

Ссылки

Неуправляемый WPF-компонент для работы с изображениями

BitmapSource

BitmapImage

Image

BitmapMetadata