Поделиться через


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

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

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

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

Компонент WPF Imaging

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

Существует два способа доступа к WPF Imaging API — управляемому компоненту и неуправляемому компоненту. Неуправляемый компонент предоставляет следующие возможности.

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

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

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

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

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

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

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

Большинство управляемых WPF Imaging API находятся в пространстве имен System.Windows.Media.Imaging, несмотря на то что несколько важных типов, таких как ImageBrush и ImageDrawing находятся в пространстве имен System.Windows.Media, а Image находится в пространстве имен System.Windows.Controls.

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

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

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

BitmapSource является важным классом, используемым для декодирования и кодирования изображений. Этот основной строительный блок конвейера WPF Imaging представляет отдельный, постоянный набор точек определенного размера и разрешения. 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 Imaging и зарегистрированные в системе, автоматически участвуют в выборе декодера. Поэтому пользовательские форматы могут автоматически отображаться в приложениях 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);

// Open a Uri and decode a BMP image
System::Uri^ myUri = gcnew System::Uri("tulipfarm.bmp", UriKind::RelativeOrAbsolute);
BmpBitmapDecoder^ decoder2 = gcnew BmpBitmapDecoder(myUri, BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::Default);
BitmapSource^ bitmapSource2 = decoder2->Frames[0];

// Draw the Image
Image^ myImage2 = gcnew Image();
myImage2->Source = bitmapSource2;
myImage2->Stretch = Stretch::None;
myImage2->Margin = System::Windows::Thickness(20);

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

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

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

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);
FileStream^ stream = gcnew FileStream("new.bmp", FileMode::Create);
BmpBitmapEncoder^ encoder = gcnew BmpBitmapEncoder();
TextBlock^ myTextBlock = gcnew TextBlock();
myTextBlock->Text = "Codec Author is: " + encoder->CodecInfo->Author->ToString();
encoder->Frames->Add(BitmapFrame::Create(image));
encoder->Save(stream);

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

Существует несколько способов отображения изображений в приложениях Windows Presentation Foundation (WPF). Изображения могут быть отображены с помощью элемента управления 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, улучшенным для загрузки Extensible Application Markup Language (XAML), и представляет собой простой способ отображения изображений в качестве Source элемента управления Image.

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

ПримечаниеПримечание

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>
' 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. Кисти позволяют рисовать от простых одноцветных объектов UI до объектов со сложными наборами шаблонов и изображений. Для рисования с помощью изображений следует использовать 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 Imaging предоставляет универсальный способ хранения и извлечения метаданных для каждого поддерживаемого формата изображения.

Доступ к метаданным предоставляется при помощи свойства Metadata объекта BitmapSource. Metadata возвращает объект BitmapMetadata, который включает в себя все метаданные, содержащиеся в изображении. Эти данные могут быть заключены в одной схеме метаданных или в комбинации различных схем. WPF Imaging поддерживает следующие схемы метаданных изображения: Exchangeable image file (Exif), tEXt (PNG Textual Data), image file directory (IFD), International Press Telecommunications Council (IPTC) и Extensible Metadata Platform (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();

// Add the metadata of the bitmap image to the text block.
TextBlock^ myTextBlock = gcnew 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();
Stream^ pngStream = gcnew FileStream("smiley.png", FileMode::Open, FileAccess::ReadWrite, FileShare::ReadWrite);
PngBitmapDecoder^ pngDecoder = gcnew 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 Imaging является модель расширяемости для новых кодеков изображений. Эти неуправляемые интерфейсы позволяют разработчикам кодеков интегрировать кодеки с WPF, чтобы автоматически использовать в приложениях WPF новые форматы изображений.

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

ПримечаниеПримечание

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

См. также

Ссылки

BitmapSource

BitmapImage

Image

BitmapMetadata

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

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

Другие ресурсы

Win32 Sample Codec