Wpf почему не отображается картинка
Перейти к содержимому

Wpf почему не отображается картинка

  • автор:

Wpf почему не отображается картинка

Элемент Image предназначен для работы с изображениями. Свойство Source позволяет задать путь к изображению, например:

WPF поддерживает различны форматы изображений: .bmp, .png, .gif, .jpg и т.д.

Также элемент позволяет проводить некоторые простейшие транформации с изображениями. Например, с помощью объекта FormatConvertedBitmap и его свойства DestinationFormat можно получить новое изображение:

Элемент Image в WPF

InkCanvas

InkCanvas представляет собой полотно, на котором можно рисовать. Первоначально оно предназначалось для стилуса, но в WPF есть поддержка также и для мыши для обычных ПК. Его очень просто использовать:

Либо мы можем вложить в InkCanvas какое-нибудь изображение и на нем уже рисовать:

Элемент InkCanvas в WPF

Все рисование в итоге представляется в виде штрихов — элементов класса System.Windows.Ink.Stroke и хранится в коллекции Strokes, определенной в классе InkCanvas.

Режим рисования

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

  • Ink : используется по умолчанию и предполагает рисование стилусом или мышью
  • InkAndGesture : рисование с помощью мыши/стилуса, а также с помощью жестов (Up, Down, Tap и др.)
  • GestureOnly : рисование только с помощью жестов пользователя
  • EraseByStroke : стирание всего штриха стилусом
  • EraseByPoint : стирание только части штриха, к которой прикоснулся стилус
  • Select : выделение всех штрихов при касании
  • None : отсутствие какого-либо действия

Используя эти значения и обрабатывая события InkCanvas, такие как StrokeCollected (штрих нарисован), StrokeErased (штрих стерли) и др., можно управлять набором штрихов и создавать более функциональные приложения на основе InkCanvas.

Wpf почему не отображается картинка

Есть сборка, с которой два проекта:
1-й — библиотека, в которой реализован контрол отображающий некоторое изображение.
Изображение было добавлено в ресурсы проекта (оно лежит в папке «Resources»).
Далее это изображение привязал к элементу Image:

Далее во втором проекте простое wpf окно, в которое я загрузил контрол

И проблема здесь заключается в том, что при запуске второго приложения картинка на контроле не отображается, при том, что в самом контроле в редакторе оно отображается.

Re: Не отображаются изображения из wpf UserControl

От: vit_as
Дата: 15.02.12 10:07
Оценка:

Здравствуйте, Sansagol, Вы писали:

попробуйте указать Source в виде pack Uri

"pack://application. /MyAssembly;component/Resources/ExampleImage.bmp"/>

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

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

Компонент обработки изображений WPF

Компонент обработки изображений WPF предоставляет значительные расширения возможностей в обработке изображений в Microsoft Windows. Возможности обработки изображений, например вывод растрового изображения или использование изображения в общем элементе управления, были ранее реализованы с помощью библиотек интерфейса графических устройств (GDI) Microsoft Windows или 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 обработки изображений WPF находятся в пространстве имен System.Windows.Media.Imaging. Но есть несколько важных типов, например ImageBrush и ImageDrawing, которые находятся в пространстве имен System.Windows.Media. Тип Image находится в пространстве имен System.Windows.Controls.

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

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

Для кодирования и декодирования конкретного формата мультимедиа используются кодеки. Компонент обработки изображений WPF включает в себя кодек для форматов изображений BMP, JPEG, PNG, TIFF, «Фото Windows Media», GIF и ICON. Каждый из этих кодеков позволяет приложениям декодировать и, за исключением формата 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

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

Во многих примерах используется объект 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 градусов.

// 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.

//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.

//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 к изображению.

Different TileBrush Stretch settings

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

    Stretching an Image           None Uniform UniformToFill Fill                

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

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

Используя кисти изображения, можно заполнять фигуры, элементы управления, текст и многое другое

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

   

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

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

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

Доступ к метаданным предоставляется через свойство Metadata объекта BitmapSource. Свойство Metadata возвращает объект BitmapMetadata, который содержит все метаданные, имеющиеся у изображения. Эти данные могут представлять собой одну схему метаданных или комбинацию различных схем. Компонент обработки изображений WPF поддерживает следующие схемы метаданных изображений: EXIF, tEXt (текстовые данные PNG), 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. В этом примере показано создание декодера и кодировщика для пользовательского формата изображения.

Чтобы система могла распознать кодек, он должен иметь цифровую подпись.

См. также

  • BitmapSource
  • BitmapImage
  • Image
  • BitmapMetadata
  • Двумерная графика и изображения
  • Пример кодека Win32

Image. Source Свойство

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Возвращает или задает источник для изображения.

public: property ImageSource ^ Source < ImageSource ^ get(); void set(ImageSource ^ value); >;
ImageSource Source(); void Source(ImageSource value);
public ImageSource Source
var imageSource = image.source; image.source = imageSource;
Public Property Source As ImageSource
Значение свойства

Объект , представляющий исходный файл изображения для нарисованного изображения. Обычно для этого используется объект BitmapImage , созданный с помощью универсального кода ресурса (URI), который описывает путь к допустимому исходному файлу изображения. Или можно инициализировать BitmapSource с помощью потока, возможно, потока из файла хранилища.

Комментарии

Установка свойства Source по сути является асинхронным действием. Поскольку это свойство, нет ожидаемого синтаксиса, но в большинстве сценариев вам не нужно взаимодействовать с асинхронными аспектами загрузки исходного файла изображения. Платформа будет ожидать возвращения источника образа и повторно запустить макет, когда исходный файл образа станет доступным.

Установка для источника значения универсального кода ресурса (URI), которое не может быть разрешено в допустимый исходный файл образа, не вызывает исключения. Вместо этого вызывается событие ImageFailed . Ошибки декодирования также запускают ImageFailed. Вы можете написать обработчик ImageFailed и присоединить его к объекту Image , чтобы обнаружить это, и, возможно, использовать ErrorMessage в данных события для определения характера сбоя. Кроме того, если вы хотите убедиться, что исходный файл изображения загружен правильно, можно обработать событие ImageOpened в элементе Image .

Задание источника в XAML

Свойство Source можно задать в качестве атрибута в XAML. В этом случае значение атрибута Source задается как строка универсального кода ресурса (URI), описывающая расположение файла исходного образа. Это поведение основано на преобразовании базового типа, которое обрабатывает строку как универсальный код ресурса (URI) и вызывает эквивалент конструктора BitmapImage(Uri). Задание свойства Source с помощью строки универсального кода ресурса (URI) является ярлыком, включенным XAML. Обратите внимание, что универсальный код ресурса (URI) здесь представляет собой относительный универсальный код ресурса (URI). Поддержка частичного универсального кода ресурса (URI) — еще один ярлык XAML.

Средство синтаксического анализа XAML интерпретирует любые строки, представляющие относительный универсальный код ресурса (URI), используя базовый универсальный код ресурса (URI) анализируемой страницы XAML. Например, если указать значение Images/myImage.png в XAML, эта строка интерпретируется как относительный суффикс пути, который добавляется к базовому расположению универсального кода ресурса (URI) в пакете приложения, где существует сама страница XAML. Если предыдущий элемент Image добавляется на страницу, которая находится в корне пакета приложения, универсальный код ресурса (URI) интерпретируется как ms-appx:///Images/myImage.png. Если изображение добавляется на страницу, которая находится в папке Pages в приложении, универсальный код ресурса (URI) интерпретируется как ms-appx:///Pages/Images/myImage.png.

Если исходный образ не является частью пакета приложения, необходимо использовать абсолютный универсальный код ресурса (URI), чтобы задать свойство Source в XAML. Дополнительные сведения см. в разделе Загрузка файловых ресурсов и примеры далее в этом документе.

Также можно использовать синтаксис элемента свойства в XAML, указав объектный элемент BitmapImage с допустимым источником в качестве значения свойства.

Задание источника в коде

Чтобы задать свойство Image.Source в коде, требуется экземпляр BitmapImage (или BitmapSource), который также необходимо создать. Если источником изображения является поток, используйте асинхронный метод SetSourceAsyncbitmapImage , чтобы определить сведения об изображении из потока.

Если источником изображения является файл, на который ссылается универсальный код ресурса (URI), задайте свойство BitmapImage.UriSource или используйте конструктор BitmapImage , который принимает параметр URI. Среда выполнения Windows принудительно указывает, что универсальный код ресурса (URI) должен быть абсолютным; нельзя использовать относительный универсальный код ресурса (URI) в среда выполнения Windows коде. Если вы используете платформа .NET Framework значение System.Uri и используете сигнатуру, для которых требуется значение UriKind, обязательно укажите Значение Absolute.

При ссылке на локальное содержимое необходимо включить схему ms-appx: в абсолютный универсальный код ресурса (URI), который используется в качестве BitmapImage.UriSource. В коде вы не получаете ярлыки обработки для объединения относительных частей универсального кода ресурса (URI) и схемы ms-appx:, которая происходит автоматически, если указать Source в качестве атрибута XAML. Вместо этого необходимо явно создать абсолютный универсальный код ресурса (URI) с соответствующей схемой.

Ниже описано, как задать источник изображения из пакета приложения.

Image img = new Image(); BitmapImage bitmapImage = new BitmapImage(); Uri uri = new Uri("ms-appx:///Assets/Logo.png"); bitmapImage.UriSource = uri; img.Source = bitmapImage; // OR Image img = new Image(); img.Source = new BitmapImage(new Uri("ms-appx:///Assets/Logo.png")); 
Windows::UI::Xaml::Controls::Image img; Windows::UI::Xaml::Media::Imaging::BitmapImage bitmapImage; Windows::Foundation::Uri uri< L"ms-appx:///Assets/LockScreenLogo.png" >; bitmapImage.UriSource(uri); img.Source(bitmapImage); // OR Windows::UI::Xaml::Controls::Image img; img.Source(Windows::UI::Xaml::Media::Imaging::BitmapImage < Windows::Foundation::Uri< L"ms-appx:///Assets/LockScreenLogo.png" >>); 
auto img = ref new Image(); auto bitmapImage = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); auto uri = ref new Windows::Foundation::Uri("ms-appx:///Assets/Logo.png"); bitmapImage->UriSource = uri; img->Source = bitmapImage; // OR auto img = ref new Image(); img->Source = ref new BitmapImage(ref new Windows::Foundation::Uri("ms-appx:///Assets/Logo.png")); 

Если необходимо убедиться, что элемент управления Image готов, прежде чем пытаться использовать его в коде, обработайте событие Loaded и задайте свойство Source в обработчике событий.

Событие FrameworkElement.Loaded возникает при загрузке элемента управления Image на страницу XAML. Событие ImageOpened возникает при открытии файла изображения в элементе управления Изображение .

Ниже приведен пример настройки Image.Source в обработчике события Loaded . В этом примере объект Image был создан в XAML, но не имеет источника или других значений свойств. Вместо этого эти значения предоставляются во время выполнения при загрузке образа из XAML.

void Image_Loaded(object sender, RoutedEventArgs e) < Image img = sender as Image; if (img != null) < BitmapImage bitmapImage = new BitmapImage(); img.Width = bitmapImage.DecodePixelWidth = 280; bitmapImage.UriSource = new Uri("ms-appx:///Assets/Logo.png"); img.Source = bitmapImage; >> 
void MainPage::Image_Loaded(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& /* e */) < auto img< sender.as() >; // throws if QI fails, so no need for null-check afterwards. Windows::UI::Xaml::Media::Imaging::BitmapImage bitmapImage; img.Width(280); bitmapImage.DecodePixelWidth(280); bitmapImage.UriSource(Windows::Foundation::Uri< L"ms-appx:///Assets/LockScreenLogo.png" >); img.Source(bitmapImage); > 
void App1::MainPage::Image_Loaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) < auto img = dynamic_cast(sender); if (img != nullptr) < auto bitmapImage = ref new BitmapImage(); img->Width = 280; bitmapImage->DecodePixelWidth = 280; bitmapImage->UriSource = ref new Uri("ms-appx:///Assets/Logo.png"); img->Source = bitmapImage; > > 

Событие ImageOpened можно обработать при возникновении проблем со временем при извлечении или декодировании источника изображения, где может потребоваться дополнительное содержимое для отображения до тех пор, пока источник изображения не будет доступен. Пример кода см . в разделе Пример изображений XAML .

Использование относительного URI в коде

Ранее мы видели, что средство синтаксического анализа XAML интерпретирует относительный универсальный код ресурса (URI) с помощью базового универсального кода ресурса (URI) анализируемой страницы XAML. Для достижения того же результата в коде можно создать универсальный код ресурса (URI ) с помощью одного из конструкторов, создающих универсальный код ресурса (URI), объединяя абсолютный базовый и относительный путь в этом расположении. Для первого параметра вызовите BaseUri на странице , на которую загружается изображение . (Вы также можете вызвать BaseUri в экземпляре Image , где вы задаете источник, или другой элемент на странице. См. предупреждение ниже.) При этом создается универсальный код ресурса (URI) со схемой ms-appx: и добавляется путь, который является частью расположения страницы XAML. Для второго параметра передайте относительную строку универсального кода ресурса (URI), которая описывает расположение исходного образа.

В C# или Microsoft Visual Basic тип URI проецируется как System.Uri, поэтому используйте конструктор System.Uri(Uri, String), который принимает строку в качестве второго параметра. В расширениях компонентов Visual C++ (C++/CX) используйте Uri(String,String).

BitmapImage bitmapImage = new BitmapImage(); // Call BaseUri on the root Page element and combine it with a relative path // to consruct an absolute URI. bitmapImage.UriSource = new Uri(this.BaseUri, "Assets/placeholder.png"); capturedPhoto.Source = bitmapImage; 
auto bitmapImage = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); // Call BaseUri on the root Page element and combine it with a relative path // to consruct an absolute URI. bitmapImage->UriSource = ref new Windows::Foundation::Uri(BaseUri->AbsoluteUri, "Assets/placeholder.png"); capturedPhoto->Source = bitmapImage; 

При создании экземпляра нового изображения в коде свойство BaseUri будет иметь значение NULL , пока изображение не будет добавлено в визуальное дерево страницы. Например, следующий код вызывает исключение ArgumentNull . Чтобы избежать исключения, добавьте image в визуальное дерево перед заданием свойства Source.

В этом примере создается исключение, так как он вызывает BaseUri для образа перед добавлением образа на страницу. Предполагается, что stackPanel1 — это элемент StackPanel, объявленный в XAML.

Image img = new Image(); BitmapImage bitmapImage = new BitmapImage(); // AN EXCEPTION IS THROWN BECAUSE img.BaseUri IS NULL AT THIS POINT. Uri uri = new Uri(img.BaseUri, "Assets/Logo.png"); bitmapImage.UriSource = uri; img.Source = bitmapImage; stackPanel1.Children.Add(img); 
auto img = ref new Image(); auto bitmapImage = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); // AN EXCEPTION IS THROWN BECAUSE img->BaseUri IS NULL AT THIS POINT. auto uri = ref new Windows::Foundation::Uri(img->BaseUri->AbsoluteUri, "Assets/Logo.png"); bitmapImage->UriSource = uri; img->Source = bitmapImage; stackPanel1->Children->Append(img); 

Чтобы избежать этой ошибки, можно вызвать BaseUri на самой странице , как показано выше, или добавить изображение на страницу перед вызовом BaseUri, как показано ниже.

В этом примере изображение добавляется на страницу перед вызовом BaseUri, поэтому BaseUri не имеет значения NULL. Предполагается, что stackPanel1 — это элемент StackPanel, объявленный в XAML.

Image img = new Image(); // Add the image to the page. stackPanel1.Children.Add(img); BitmapImage bitmapImage = new BitmapImage(); // img.BaseUri in not null because img has been added to the page. Uri uri = new Uri(img.BaseUri, "Assets/Logo.png"); bitmapImage.UriSource = uri; img.Source = bitmapImage; 
auto img = ref new Image(); // Add the image to the page. stackPanel1->Children->Append(img); auto bitmapImage = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); // img->BaseUri in not null because img has been added to the page. auto uri = ref new Windows::Foundation::Uri(img->BaseUri->AbsoluteUri, "Assets/Logo.png"); bitmapImage->UriSource = uri; img->Source = bitmapImage; 

Использование файлов из сети

Чтобы использовать файл из сетевого расположения в качестве источника образа, используйте схемы http: или https: , как показано ниже. Укажите абсолютный универсальный код ресурса (URI). Дополнительные сведения см. в разделе Загрузка файлового ресурса.

Image img = new Image(); img.Source = new BitmapImage(new Uri("http://www.contoso.com/images/logo.png")); 
auto img = ref new Image(); img->Source = ref new BitmapImage(ref new Windows::Foundation::Uri("http://www.contoso.com/images/logo.png")); 

Использование файлов из локального хранилища

Чтобы использовать файлы, размещенные в локальном хранилище приложения в качестве источника изображений, используйте схему ms-appdata: , как показано ниже. Укажите абсолютный универсальный код ресурса (URI). Дополнительные сведения см. в разделе Загрузка файлового ресурса.

var uri = new System.Uri("ms-appdata:///local/images/logo.png"); var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri); Image img = new Image(); img.Source = file; 

GetFileFromApplicationUriAsync(uri); auto img = ref new Image(); img->Source = file;]]> —>

Использование источника потока для отображения изображений из библиотеки изображений

Обычно элементы Image в приложении используются для отображения изображений из библиотеки изображений пользователя. Доступ к этим изображениям можно получить программным способом или с помощью FileOpenPicker. В любом случае объект StorageFile , который вы получаете, можно открыть в виде потока, но не предоставляет ссылку на универсальный код ресурса (URI) на файл изображения. Чтобы использовать поток в качестве источника изображения, необходимо написать код, который задает экземпляр Image для использования потока. Это невозможно сделать только в XAML.

Чтобы отобразить отдельное изображение, используйте объекты StorageFile из перечисления библиотеки и вызовите OpenAsync для получения потока. Используйте этот поток для задания источника изображения, создав новый Объект BitmapImage, а затем вызвав SetSourceAsync и передав поток для использования в качестве параметра streamSource .

В этом примере показано, как использовать FileOpenPicker для доступа к файлу изображения из библиотеки изображений и задать его в качестве источника элемента управления Image . Код уже доступен для ожидания, так как он ожидает, когда пользователь выберет файл, и выполняется только после этого. Используемый поток поступает из StorageFile.OpenAsync после возврата экземпляра StorageFile из действий асинхронного средства выбора. Дополнительные сведения об использовании средств выбора файлов см. в разделе Открытие файлов и папок с помощью средства выбора.

private async void GetPhotoButton_Click(object sender, RoutedEventArgs e) < // Set up the file picker. Windows.Storage.Pickers.FileOpenPicker openPicker = new Windows.Storage.Pickers.FileOpenPicker(); openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary; openPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail; // Filter to include a sample subset of file types. openPicker.FileTypeFilter.Clear(); openPicker.FileTypeFilter.Add(".bmp"); openPicker.FileTypeFilter.Add(".png"); openPicker.FileTypeFilter.Add(".jpeg"); openPicker.FileTypeFilter.Add(".jpg"); // Open the file picker. Windows.Storage.StorageFile file = await openPicker.PickSingleFileAsync(); // 'file' is null if user cancels the file picker. if (file != null) < // Open a stream for the selected file. // The 'using' block ensures the stream is disposed // after the image is loaded. using (Windows.Storage.Streams.IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read)) < // Set the image source to the selected bitmap. Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); bitmapImage.SetSource(fileStream); image1.Source = bitmapImage; >> > 

В этом примере показано, как программным способом получить доступ к файлу изображения из библиотеки изображений и задать его в качестве источника элемента управления Image . Чтобы получить доступ к содержимому библиотеки изображений программным способом, вызовите StorageFolder.GetFilesAsync. Помните, что необходимо указать возможность программного доступа к библиотеке изображений.

protected async override void OnNavigatedTo(NavigationEventArgs e) < // Get the Pictures library Windows.Storage.StorageFolder picturesFolder = Windows.Storage.KnownFolders.PicturesLibrary; IReadOnlyListfolders = await picturesFolder.GetFoldersAsync(); // Process file folders foreach (StorageFolder folder in folders) < // Get and process files in folder IReadOnlyListfileList = await folder.GetFilesAsync(); foreach (StorageFile file in fileList) < Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); // Open a stream for the selected file. // The 'using' block ensures the stream is disposed // after the image is loaded. using (Windows.Storage.Streams.IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read)) < // Set the image source to the selected bitmap. Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); bitmapImage.SetSource(fileStream); // Create an Image control. Image img = new Image(); img.Height = 50; img.Source = bitmapImage; // Add the Image control to the UI. 'imageGrid' is a // VariableSizedWrapGrid declared in the XAML page. imageGrid.Children.Add(img); >> > > 

Исходные изображения и масштабирование

Если вы ссылаетесь на изображения, упакованные в приложение, следует создать источники изображений в нескольких рекомендуемых размерах, чтобы приложение выглядело отлично при масштабировании среда выполнения Windows. При указании источника для образа в качестве универсального кода ресурса (URI) можно использовать соглашение об именовании, которое автоматически ссылается на правильный ресурс образа для текущего масштабирования, обнаруженного системой во время выполнения. Особенности контекста именования и дополнительные сведения описываются в разделе Краткое руководство: использование файловых и графических ресурсов.

Дополнительные сведения о проектировании для масштабирования см. в разделе Адаптивный дизайн 101 для или Примечания на изображении.

Источники образов и квалификаторы ресурсов

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

Применяется к

См. также раздел

  • ImageFailed
  • ImageOpened
  • BitmapSource
  • Изображения и кисти изображений
  • Пример изображений в XAML

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *