Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе приведены общие сведения о компоненте образов Microsoft Windows Presentation Foundation. WpF Imaging позволяет разработчикам отображать, преобразовывать и форматировать изображения.
Компонент имиджинга WPF
Функция "Образы WPF" обеспечивает значительные улучшения возможностей визуализации в Microsoft Windows. Возможности визуализации, такие как отображение растрового изображения или использование изображения на общем элементе управления, ранее зависели от библиотек microsoft Windows Graphics Device Interface (GDI) или Microsoft Windows GDI+ . Эти API предоставляют базовые функции визуализации, но не хватает таких функций, как поддержка расширяемости кодека и поддержки изображений высокой точности. Система обработки изображений WPF разработана для преодоления недостатков GDI и GDI+ и предоставления нового набора API для отображения и использования изображений в ваших приложениях.
Существует два способа доступа к API образов WPF, управляемому компоненту и неуправляемым компонентам. Неуправляемый компонент предоставляет следующие функции.
Модель расширяемости для новых или закрытых форматов изображений.
Улучшена производительность и безопасность в собственных форматах изображений, включая растровое изображение (BMP), группу экспертов по совместным фотографиям (JPEG), переносимую сетевую графику (PNG), формат файла тегов (TIFF), фото Microsoft Windows Media, формат обмена графикой (GIF) и значок (.ico).
Сохранение данных изображения с высокой глубиной до 8 бит на канал (32 бита на пиксель).
Недеструктивное масштабирование изображений, обрезка и повороты.
Упрощенное управление цветами.
Поддержка встроенных метаданных в файле.
Управляемый компонент использует неуправляемую инфраструктуру для обеспечения простой интеграции изображений с другими функциями WPF, такими как пользовательский интерфейс, анимация и графика. Управляемый компонент также использует модель расширяемости кодека образов Windows Presentation Foundation (WPF), которая обеспечивает автоматическое распознавание новых форматов изображений в приложениях WPF.
Большинство управляемых API Imaging WPF находятся в пространстве имен 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 и представляет один постоянный набор пикселей с определенным размером и разрешением. BitmapSource может быть отдельным кадром многокадрового изображения или результатом преобразования, выполненного на BitmapSource. Это родительский элемент многих основных классов, используемых в обработке изображений WPF, например BitmapFrame.
Используется BitmapFrame для хранения фактических растровых данных формата изображения. Многие форматы изображений поддерживают только один формат BitmapFrame, хотя такие форматы, как GIF и TIFF, поддерживают несколько кадров на изображение. Кадры используются декодировщиками в качестве входных данных и передаются кодировщикам для создания файлов изображений.
В следующем примере показано, как BitmapFrame создается из BitmapSource, а затем добавляется в изображение TIFF.
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);
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)
Декодирование формата изображения
Декодирование изображений — это перевод формата изображения в данные изображения, которые могут использоваться системой. Затем данные изображения можно использовать для отображения, обработки или кодирования в другом формате. Выбор декодера основан на формате изображения. Выбор кодека выполняется автоматически, если не указан определенный декодатор. Примеры в разделе "Отображение изображений в WPF " демонстрируют автоматическое декодирование. Пользовательские декодеры форматов, разработанные с помощью неуправляемых интерфейсов образов WPF и зарегистрированные в системе, автоматически участвуют в выборе соответствующего декодера. Это позволяет автоматически отображать пользовательские форматы в приложениях WPF.
В следующем примере показано использование декодера растрового рисунка для декодирования изображения в формате BMP.
// 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);
// 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
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)
Кодировка формата изображения
Кодировка изображений — это перевод данных изображения в определенный формат изображения. Затем данные закодированного изображения можно использовать для создания новых файлов изображений. Модуль обработки изображений WPF предоставляет кодировщики для каждого из описанных выше форматов изображения.
В следующем примере показано использование кодировщика для сохранения только что созданного растрового изображения.
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);
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);
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)
Отображение изображений в WPF
Существует несколько способов отображения изображения в приложении Windows Presentation Foundation (WPF). Изображения можно отобразить с помощью элемента управления Image, нарисовать на визуальном элементе с помощью ImageBrush, или создать с использованием ImageDrawing.
Использование элемента управления изображением
Image — это элемент платформы и основной способ отображения изображений в приложениях. В 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 than 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) и предоставляет простой способ отображения изображений в качестве Source управляющего элемента Image.
В следующем примере показано, как отрисовать изображение шириной 200 пикселей с помощью кода.
Замечание
BitmapImage реализует интерфейс ISupportInitialize для оптимизации инициализации по нескольким свойствам. Изменения свойств могут возникать только во время инициализации объектов. Для начала инициализации выполните вызов BeginInit, а для завершения - вызов EndInit. После инициализации изменения свойств игнорируются.
// 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 than 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
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 than 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.
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;
' 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
Преобразование изображения в другой формат пикселей, например оттенки серого, выполняется с помощью 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
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;
'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
Для обрезки изображения можно использовать свойство 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
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;
' 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
Растяжение изображений
Свойство Stretch контролирует процесс растяжения изображения, чтобы заполнить его контейнер. Свойство Stretch принимает следующие значения, определенные перечислением Stretch:
None: изображение не растянуто для заполнения области вывода. Если изображение больше области вывода, оно отображается в этой области, обрезая выступающие части.
Fill: изображение масштабируется в соответствии с выходной областью. Так как высота и ширина изображения масштабируются независимо, исходное соотношение пропорций изображения может не сохраняться. То есть изображение может быть искажено, чтобы полностью заполнить выходной контейнер.
Uniform: изображение масштабируется таким образом, чтобы оно полностью соответствовало выходной области. Пропорции изображения сохраняются.
UniformToFill: изображение масштабируется таким образом, чтобы он полностью заполнял область вывода при сохранении исходного пропорции изображения.
В следующем примере каждое из доступных перечислений Stretch применяется к Image.
На следующем рисунке показаны выходные данные из примера и демонстрируется влияние различных Stretch параметров при применении к изображению.
Различные параметры растяжения
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://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рисунках и рисунках см. в разделе "Рисование" с помощью изображений, рисунков и визуальных элементов.
Метаданные изображения
Некоторые файлы изображений содержат метаданные, описывающие содержимое или характеристики файла. Например, большинство цифровых камер создают изображения, содержащие метаданные о создании и модели камеры, используемой для захвата изображения. Каждый формат изображения обрабатывает метаданные по-разному, но wpF Imageing предоставляет универсальный способ хранения и получения метаданных для каждого поддерживаемого формата изображения.
Доступ к метаданным предоставляется через Metadata свойство BitmapSource объекта. Metadata BitmapMetadata возвращает объект, содержащий все метаданные, содержащиеся в изображении. Эти данные могут находиться в одной схеме метаданных или сочетании различных схем. WPF Imaging поддерживает следующие схемы метаданных изображения: Exchangeable image file (Exif), tEXt (PNG Textual Data), каталог файлов изображений (IFD), Международный совет по вопросам телекоммуникаций и средств массовой информации (IPTC) и расширяемую платформу метаданных (XMP).
Чтобы упростить процесс чтения метаданных, BitmapMetadata предоставляет несколько именованных свойств, которые можно легко получить, например, Author, Title и CameraModel. Многие из этих именованных свойств также можно использовать для записи метаданных. Дополнительная поддержка чтения метаданных предоставляется средством чтения запросов метаданных. Метод GetQuery используется для получения средства чтения метаданных, предоставляя строковый запрос, например "/app1/exif/". В следующем примере GetQuery используется для получения текста, хранящегося в расположении /Text/Description .
// 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();
// 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.
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "The Description metadata of this image is: " + pngInplace.GetQuery("/Text/Description").ToString()
Для записи метаданных используется модуль записи запросов метаданных. SetQuery получает модуль записи запросов и задает требуемое значение. В следующем примере SetQuery используется для записи текста, хранящегося в расположении /Text/Description .
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();
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();
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()
Расширяемость кодека
Основная функция образов WPF — это модель расширяемости для новых кодеков изображений. Эти неуправляемые интерфейсы позволяют разработчикам кодека интегрировать кодеки с WPF, чтобы новые форматы изображений могли автоматически использоваться приложениями WPF.
Пример API расширяемости см. в примере кода Win32. В этом примере показано, как создать декодировщик и кодировщик для пользовательского формата изображения.
Замечание
Кодек должен быть цифрово подписан для того, чтобы система распознала ее.
См. также
.NET Desktop feedback