Przegląd Obrazowanie

Ten temat zawiera wprowadzenie do składnika Microsoft Windows Presentation Foundation Imaging. Obrazowanie WPF umożliwia deweloperom wyświetlanie, przekształcanie i formatowanie obrazów.

Składnik obrazu WPF

Obrazowanie WPF zapewnia znaczne ulepszenia możliwości tworzenia obrazów w systemie Microsoft Windows. Możliwości tworzenia obrazów, takie jak wyświetlanie mapy bitowej lub używanie obrazu na wspólnej kontrolce, były wcześniej zależne od bibliotek GDI (GDI) lub Microsoft Windows GDI+. Ten interfejs API zapewnia podstawowe funkcje tworzenia obrazów, ale brakuje funkcji, takich jak obsługa rozszerzalności kodera i obsługa obrazów o wysokiej wierności. Obrazowanie WPF zostało zaprojektowane w celu przezwyciężenia niedociągnięć interfejsu GDI i GDI+ oraz udostępnienia nowego zestawu interfejsu API do wyświetlania i używania obrazów w aplikacjach.

Istnieją dwa sposoby uzyskiwania dostępu do interfejsu API przetwarzania obrazów WPF, składnika zarządzanego i składnika niezarządzanego. Składnik niezarządzany udostępnia następujące funkcje.

  • Model rozszerzalności dla nowych lub zastrzeżonych formatów obrazów.

  • Zwiększona wydajność i bezpieczeństwo natywnych formatów obrazów, w tym mapy bitowej (BMP), Joint Photos Experts Group (JPEG), przenośnej grafiki sieciowej (PNG), otagowanych formatów plików obrazów (TIFF), Microsoft Windows Media Photo, Graphics Interchange Format (GIF) i ikon (.ico).

  • Zachowywanie danych obrazu o wysokiej głębokości bitowej do 8 bitów na kanał (32 bity na piksel).

  • Niezniszczające skalowanie obrazów, przycinanie i rotacje.

  • Uproszczone zarządzanie kolorami.

  • Obsługa metadanych w pliku.

  • Składnik zarządzany korzysta z niezarządzanej infrastruktury, aby zapewnić bezproblemową integrację obrazów z innymi funkcjami WPF, takimi jak interfejs użytkownika, animacja i grafika. Składnik zarządzany korzysta również z modelu rozszerzalności kodera kodu programu Windows Presentation Foundation (WPF), który umożliwia automatyczne rozpoznawanie nowych formatów obrazów w aplikacjach WPF.

Większość zarządzanego interfejsu API przetwarzania obrazów WPF znajduje się w System.Windows.Media.Imaging przestrzeni nazw, choć kilka ważnych typów, takich jak ImageBrush i ImageDrawing znajduje się w System.Windows.Media przestrzeni nazw i Image znajduje się w System.Windows.Controls przestrzeni nazw.

Ten temat zawiera dodatkowe informacje o składniku zarządzanym. Aby uzyskać więcej informacji na temat niezarządzanego interfejsu API, zobacz dokumentację Niezarządzanego składnika obrazowania WPF.

Formaty obrazów WPF

Koder koderowy służy do dekodowania lub kodowania określonego formatu multimediów. Obrazowanie WPF zawiera koder kodu dla formatów obrazów BMP, JPEG, PNG, TIFF, Windows Media Photo, GIF i ICON. Każda z tych koderów umożliwia aplikacjom dekodowanie i, z wyjątkiem ikony, kodowanie odpowiednich formatów obrazów.

BitmapSource jest ważną klasą używaną w dekodowaniu i kodowaniu obrazów. Jest to podstawowy blok konstrukcyjny potoku obrazowania WPF i reprezentuje pojedynczy, stały zestaw pikseli o określonym rozmiarze i rozdzielczości. Może BitmapSource to być pojedyncza ramka obrazu z wieloma ramami lub może być wynikiem przekształcenia wykonywanego na obiekcie BitmapSource. Jest to element nadrzędny wielu klas podstawowych używanych w obrazowaniu WPF, takich jak BitmapFrame.

Element służy BitmapFrame do przechowywania rzeczywistych danych mapy bitowej w formacie obrazu. Wiele formatów obrazów obsługuje tylko jeden BitmapFrameformat , chociaż formaty, takie jak GIF i TIFF, obsługują wiele ramek na obraz. Ramki są używane przez dekodatory jako dane wejściowe i są przekazywane do koderów w celu utworzenia plików obrazów.

W poniższym przykładzie pokazano, jak BitmapFrame element jest tworzony na podstawie elementu BitmapSource , a następnie dodawany do obrazu 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)

Dekodowanie formatu obrazu

Dekodowanie obrazów to tłumaczenie formatu obrazu na dane obrazu, które mogą być używane przez system. Dane obrazu mogą być następnie używane do wyświetlania, przetwarzania lub kodowania w innym formacie. Wybór dekodera jest oparty na formacie obrazu. Wybór kodera jest automatyczny, chyba że określono określony dekoder. Przykłady w sekcji Wyświetlanie obrazów w WPF pokazują automatyczne dekodowanie. Dekodatory formatu niestandardowego opracowane przy użyciu niezarządzanych interfejsów WPF Imaging i zarejestrowane w systemie automatycznie uczestniczą w zaznaczeniu dekodera. Umożliwia to automatyczne wyświetlanie formatów niestandardowych w aplikacjach WPF.

W poniższym przykładzie pokazano użycie dekodera mapy bitowej do dekodowania obrazu formatu 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)

Kodowanie formatu obrazu

Kodowanie obrazów to tłumaczenie danych obrazu do określonego formatu obrazu. Zakodowane dane obrazu mogą następnie służyć do tworzenia nowych plików obrazów. Obrazowanie WPF udostępnia kodery dla każdego z formatów obrazów opisanych powyżej.

W poniższym przykładzie pokazano użycie kodera do zapisania nowo utworzonego obrazu mapy bitowej.

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)

Wyświetlanie obrazów w WPF

Istnieje kilka sposobów wyświetlania obrazu w aplikacji Windows Presentation Foundation (WPF). Obrazy można wyświetlać przy użyciu Image kontrolki, malowanej na wizualizacji przy użyciu elementu lub rysowanego przy użyciu ImageBrushelementu ImageDrawing.

Korzystanie z kontrolki obrazów

Image jest elementem struktury i podstawowym sposobem wyświetlania obrazów w aplikacjach. W języku XAML Image można używać na dwa sposoby: składni atrybutu lub składni właściwości. W poniższym przykładzie pokazano, jak renderować obraz o szerokości 200 pikseli przy użyciu składni atrybutu i składni tagu właściwości. Aby uzyskać więcej informacji na temat składni atrybutów i składni właściwości, zobacz Właściwości zależności — omówienie.

<!-- 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>

Wiele przykładów używa BitmapImage obiektu do odwołowania się do pliku obrazu. BitmapImage jest wyspecjalizowanym rozwiązaniem BitmapSource zoptymalizowanym pod kątem ładowania języka XAML (Extensible Application Markup Language) i jest łatwym sposobem wyświetlania obrazów jako Source kontrolki Image .

W poniższym przykładzie pokazano, jak renderować obraz o szerokości 200 pikseli przy użyciu kodu.

Uwaga

BitmapImage implementuje ISupportInitialize interfejs w celu optymalizacji inicjowania na wielu właściwościach. Zmiany właściwości mogą wystąpić tylko podczas inicjowania obiektu. Wywołaj polecenie BeginInit sygnalizujące, że zainicjowanie rozpoczęło się i EndInit sygnalizuje zakończenie inicjowania. Po zainicjowaniu zmiany właściwości są ignorowane.

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

Obracanie, konwertowanie i przycinanie obrazów

WPF umożliwia użytkownikom przekształcanie obrazów przy użyciu właściwości BitmapImage lub przy użyciu dodatkowych BitmapSource obiektów, takich jak CroppedBitmap lub FormatConvertedBitmap. Te przekształcenia obrazów można skalować lub obracać obraz, zmieniać format pikseli obrazu lub przycinać obraz.

Rotacje obrazów są wykonywane przy użyciu Rotation właściwości BitmapImage. Rotacje można wykonywać tylko w 90 stopniach. W poniższym przykładzie obraz jest obracany o 90 stopni.

<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

Konwertowanie obrazu na inny format pikseli, taki jak skala szarości, odbywa się przy użyciu polecenia FormatConvertedBitmap. W poniższych przykładach obraz jest konwertowany na 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

Aby przyciąć obraz, Clip można użyć właściwości Image lub CroppedBitmap . Zazwyczaj, jeśli chcesz tylko wyświetlić część obrazu, Clip należy użyć. Jeśli musisz kodować i zapisywać przycięty obraz, należy go CroppedBitmap użyć. W poniższym przykładzie obraz jest przycinany przy użyciu właściwości Clip przy użyciu elementu 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

Rozciąganie obrazów

Właściwość Stretch określa sposób rozciągania obrazu w celu wypełnienia kontenera. Właściwość Stretch akceptuje następujące wartości zdefiniowane przez Stretch wyliczenie:

  • None: Obraz nie jest rozciągnięty, aby wypełnić obszar danych wyjściowych. Jeśli obraz jest większy niż obszar wyjściowy, obraz jest rysowany do obszaru wyjściowego, przycinając, co nie pasuje.

  • Fill: Obraz jest skalowany w celu dopasowania do obszaru danych wyjściowych. Ponieważ wysokość i szerokość obrazu są skalowane niezależnie, oryginalny współczynnik proporcji obrazu może nie zostać zachowany. Oznacza to, że obraz może zostać wypaczony w celu całkowitego wypełnienia kontenera wyjściowego.

  • Uniform: Obraz jest skalowany tak, aby mieścił się całkowicie w obszarze danych wyjściowych. Współczynnik proporcji obrazu jest zachowywany.

  • UniformToFill: Obraz jest skalowany tak, aby całkowicie wypełniał obszar wyjściowy przy zachowaniu oryginalnego współczynnika proporcji obrazu.

Poniższy przykład stosuje każde z dostępnych Stretch wyliczeń do elementu Image.

Na poniższej ilustracji przedstawiono dane wyjściowe z przykładu i pokazano wpływ na różne Stretch ustawienia zastosowane do obrazu.

Different TileBrush Stretch settings
Różne ustawienia rozciągnięcia

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

Malowanie przy użyciu obrazów

Obrazy mogą być również wyświetlane w aplikacji przez malowanie za pomocą elementu Brush. Pędzle umożliwiają malowanie obiektów interfejsu użytkownika z wszystkimi elementami, od prostych, stałych kolorów do złożonych zestawów wzorców i obrazów. Aby malować obrazami, użyj elementu ImageBrush. Element ImageBrush to typ TileBrush , który definiuje jego zawartość jako obraz mapy bitowej. Obiekt ImageBrush wyświetla pojedynczy obraz, który jest określony przez jego ImageSource właściwość. Możesz kontrolować, jak obraz jest rozciągnięty, wyrównany i kafelkowy, co pozwala zapobiegać zniekształceniom i produkować wzorce i inne efekty. Na poniższej ilustracji przedstawiono niektóre efekty, które można osiągnąć za pomocą elementu ImageBrush.

ImageBrush output examples
Pędzle obrazów mogą wypełniać kształty, kontrolki, tekst i nie tylko

W poniższym przykładzie pokazano, jak malować tło przycisku przy użyciu obrazu przy użyciu elementu 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>

Aby uzyskać dodatkowe informacje na temat ImageBrush obrazów i obrazów, zobacz Malowanie za pomocą obrazów, rysunków i wizualizacji.

Metadane obrazu

Niektóre pliki obrazów zawierają metadane opisujące zawartość lub cechy pliku. Na przykład większość cyfrowych aparatów fotograficznych tworzy obrazy zawierające metadane dotyczące make i modelu aparatu używanego do przechwytywania obrazu. Każdy format obrazu obsługuje metadane inaczej, ale obrazowanie WPF zapewnia jednolity sposób przechowywania i pobierania metadanych dla każdego obsługiwanego formatu obrazu.

Dostęp do metadanych jest udostępniany za pośrednictwem Metadata właściwości BitmapSource obiektu. MetadataBitmapMetadata Zwraca obiekt zawierający wszystkie metadane zawarte na obrazie. Te dane mogą znajdować się w jednym schemacie metadanych lub kombinacji różnych schematów. Obrazowanie WPF obsługuje następujące schematy metadanych obrazu: Plik obrazu z możliwością wymiany (Exif), tEXt (PNG Textual Data), katalog plików obrazów (IFD), International Press Telecommunications Council (IPTC) i Extensible Metadata Platform (XMP).

Aby uprościć proces odczytywania metadanych, udostępnia kilka nazwanych właściwości, BitmapMetadata do których można łatwo uzyskać dostęp, takich jak Author, Titlei CameraModel. Wiele z tych nazwanych właściwości może służyć również do zapisywania metadanych. Dodatkowa obsługa odczytywania metadanych jest udostępniana przez czytnik zapytań metadanych. Metoda GetQuery służy do pobierania czytnika zapytań metadanych przez podanie zapytania w postaci ciągu, takiego jak "/app1/exif/". W poniższym przykładzie GetQuery jest używany do uzyskiwania tekstu przechowywanego w lokalizacji "/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()

Do zapisywania metadanych jest używany moduł zapisywania zapytań metadanych. SetQuery uzyskuje moduł zapisywania zapytań i ustawia żądaną wartość. W poniższym przykładzie SetQuery jest używany do pisania tekstu przechowywanego w lokalizacji "/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()

Rozszerzalność kodera

Główną funkcją obrazu WPF jest model rozszerzalności dla nowych koderów obrazów. Te niezarządzane interfejsy umożliwiają deweloperom koderacy integrowanie koderów codecs z WPF, dzięki czemu nowe formaty obrazów mogą być automatycznie używane przez aplikacje WPF.

Aby zapoznać się z przykładem interfejsu API rozszerzalności, zobacz przykładowy koder codec systemu Win32. W tym przykładzie pokazano, jak utworzyć dekoder i koder dla niestandardowego formatu obrazu.

Uwaga

Koder koder musi być podpisany cyfrowo, aby system go rozpoznał.

Zobacz też