Bagikan melalui


Gambaran Umum Pencitraan

Topik ini menyediakan pengantar Komponen Pencitraan Microsoft Windows Presentation Foundation. Pencitraan WPF memungkinkan pengembang untuk menampilkan, mengubah, dan memformat gambar.

Komponen Pencitraan WPF

Pencitraan WPF memberikan peningkatan signifikan dalam kemampuan pencitraan dalam Microsoft Windows. Kemampuan pencitraan, seperti menampilkan bitmap atau menggunakan gambar pada kontrol umum sebelumnya bergantung pada pustaka Microsoft Windows Graphics Device Interface (GDI) atau Microsoft Windows GDI+. API ini menyediakan fungsionalitas pencitraan dasar, tetapi tidak memiliki fitur seperti dukungan untuk ekstensibilitas codec dan dukungan gambar dengan keakuratan tinggi. Pencitraan WPF dirancang untuk mengatasi kekurangan GDI dan GDI+ dan menyediakan sekumpulan API baru untuk menampilkan dan menggunakan gambar dalam aplikasi Anda.

Ada dua cara untuk mengakses WPF Imaging API, komponen terkelola, dan komponen yang tidak dikelola. Komponen yang tidak dikelola menyediakan fitur berikut.

  • Model ekstensibilitas untuk format gambar baru atau eksklusif.

  • Peningkatan performa dan keamanan pada format gambar asli termasuk bitmap (BMP), Joint Photographics Experts Group (JPEG), Portable Network Graphics (PNG), Tagged Image File Format (TIFF), Microsoft Windows Media Photo, Graphics Interchange Format (GIF), dan icon (.ico).

  • Preservasi data gambar kedalaman bit tinggi hingga 8 bit per saluran (32 bit per piksel).

  • Penskalaan, pemangkasan, dan rotasi gambar yang tidak merusak.

  • Manajemen warna yang disederhanakan.

  • Dukungan untuk metadata dalam file dan kepemilikan.

  • Komponen terkelola menggunakan infrastruktur yang tidak dikelola untuk menyediakan integrasi gambar yang mulus dengan fitur WPF lainnya seperti antarmuka pengguna (UI), animasi, dan grafik. Komponen terkelola juga mendapat manfaat dari model ekstensibilitas codec pencitraan Windows Presentation Foundation (WPF) yang memungkinkan pengenalan otomatis format gambar baru dalam aplikasi WPF.

Sebagian besar API Pencitraan WPF terkelola berada di System.Windows.Media.Imaging namespace layanan, meskipun beberapa jenis penting, seperti ImageBrush dan ImageDrawing berada di System.Windows.Media namespace layanan dan Image berada di System.Windows.Controls namespace layanan.

Topik ini menyediakan informasi tambahan tentang komponen terkelola. Untuk informasi selengkapnya tentang API yang tidak dikelola, lihat dokumentasi Komponen Pencitraan WPF Tidak Terkelola.

Format Gambar WPF

Codec digunakan untuk mendekode atau mengodekan format media tertentu. WPF Imaging mencakup codec untuk format gambar BMP, JPEG, PNG, TIFF, Windows Media Photo, GIF, dan ICON. Masing-masing codec ini memungkinkan aplikasi untuk mendekode dan, dengan pengecualian ICON, mengodekan format gambar masing-masing.

BitmapSource adalah kelas penting yang digunakan dalam decoding dan pengodean gambar. Ini adalah blok penyusun dasar dari alur Pencitraan WPF dan mewakili satu set piksel konstan pada ukuran dan resolusi tertentu. BitmapSource Dapat berupa bingkai individual dari beberapa gambar bingkai, atau dapat menjadi hasil dari transformasi yang dilakukan pada BitmapSource. Ini adalah induk dari banyak kelas utama yang digunakan dalam pencitraan WPF seperti BitmapFrame.

BitmapFrame digunakan untuk menyimpan data bitmap aktual dari format gambar. Banyak format gambar hanya mendukung satu BitmapFrame, meskipun format seperti GIF dan TIFF mendukung beberapa bingkai per gambar. Bingkai digunakan oleh decoder sebagai data input dan diteruskan ke encoder untuk membuat file gambar.

Contoh berikut menunjukkan bagaimana dibuat BitmapFrame dari BitmapSource lalu ditambahkan ke gambar 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)

Pendekodean Format Gambar

Decoding gambar adalah terjemahan format gambar ke data gambar yang dapat digunakan oleh sistem. Data gambar kemudian dapat digunakan untuk menampilkan, memproses, atau mengodekan ke format yang berbeda. Pilihan dekoder didasarkan pada format gambar. Pemilihan codec bersifat otomatis kecuali dekoder tertentu ditentukan. Contoh di bagian Menampilkan Gambar di WPF menunjukkan dekode otomatis. Dekoder format kustom dikembangkan menggunakan antarmuka Pencitraan WPF yang tidak dikelola dan terdaftar dengan sistem secara otomatis berpartisipasi dalam pemilihan dekoder. Ini memungkinkan format kustom ditampilkan secara otomatis dalam aplikasi WPF.

Contoh berikut menunjukkan penggunaan dekoder bitmap untuk mendekode gambar format 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)

Pengodean Format Gambar

Pengodean gambar adalah terjemahan data gambar ke format gambar tertentu. Data gambar yang dikodekan kemudian dapat digunakan untuk membuat file gambar baru. Pencitraan WPF menyediakan encoder untuk setiap format gambar yang dijelaskan di atas.

Contoh berikut menunjukkan penggunaan encoder untuk menyimpan gambar bitmap yang baru dibuat.

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)

Menampilkan Gambar di WPF

Ada beberapa cara untuk menampilkan gambar dalam aplikasi Windows Presentation Foundation (WPF). Gambar dapat ditampilkan menggunakan Image kontrol, dicat pada visual menggunakan ImageBrush, atau digambar menggunakan ImageDrawing.

Menggunakan Kontrol Gambar

Image adalah elemen kerangka kerja dan cara utama untuk menampilkan gambar dalam aplikasi. Di XAML, Image dapat digunakan dengan dua cara; sintaks atribut atau sintaks properti. Contoh berikut menunjukkan cara merender gambar lebar 200 piksel menggunakan sintaks atribut dan sintaks tag properti. Untuk informasi selengkapnya tentang sintaks atribut dan sintaks properti, lihat Gambaran Umum Properti Dependensi.

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

Banyak contoh menggunakan BitmapImage objek untuk mereferensikan file gambar. BitmapImage adalah spesialisasi BitmapSource yang dioptimalkan untuk pemuatan Extensible Application Markup Language (XAML) dan merupakan cara mudah untuk menampilkan gambar sebagai SourceImage kontrol.

Contoh berikut menunjukkan cara merender gambar 200 piksel lebar menggunakan kode.

Catatan

BitmapImage mengimplementasikan antarmuka untuk mengoptimalkan inisialisasi ISupportInitialize pada beberapa properti. Perubahan properti hanya dapat terjadi selama inisialisasi objek. Panggil BeginInit untuk memberi sinyal bahwa inisialisasi telah dimulai dan EndInit untuk memberi sinyal bahwa inisialisasi telah selesai. Setelah diinisialisasi, perubahan properti diabaikan.

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

Memutar, Mengonversi, dan Memangkas Gambar

WPF memungkinkan pengguna mengubah gambar dengan menggunakan properti BitmapImage atau dengan menggunakan objek tambahan BitmapSource seperti CroppedBitmap atau FormatConvertedBitmap. Transformasi gambar ini dapat menskalakan atau memutar gambar, mengubah format piksel gambar, atau memotong gambar.

Rotasi gambar dilakukan menggunakan Rotation properti .BitmapImage Rotasi hanya dapat dilakukan dalam kenaikan 90 derajat. Dalam contoh berikut, gambar diputar 90 derajat.

<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

Mengonversi gambar ke format piksel yang berbeda seperti skala abu-abu dilakukan menggunakan FormatConvertedBitmap. Dalam contoh berikut, gambar dikonversi ke 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

Untuk memangkas gambar, Clip properti atau ImageCroppedBitmap dapat digunakan. Biasanya, jika Anda hanya ingin menampilkan sebagian gambar, Clip harus digunakan. Jika Anda perlu mengodekan dan menyimpan gambar yang dipotong, CroppedBitmap gambar harus digunakan. Dalam contoh berikut, gambar dipangkas menggunakan properti Klip menggunakan 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

Gambar Peregangan

Properti Stretch mengontrol bagaimana gambar direntangkan untuk mengisi kontainernya. Properti Stretch menerima nilai berikut, yang ditentukan oleh Stretch enumerasi:

  • None: Gambar tidak direntangkan untuk mengisi area output. Jika gambar lebih besar dari area output, gambar digambar ke area output, mengklip apa yang tidak cocok.

  • Fill: Gambar diskalakan agar sesuai dengan area output. Karena tinggi dan lebar gambar diskalakan secara independen, rasio aspek asli gambar mungkin tidak dipertahankan. Artinya, gambar mungkin dibenamkan untuk sepenuhnya mengisi kontainer output.

  • Uniform: Gambar diskalakan sehingga sepenuhnya sesuai dalam area output. Rasio aspek gambar dipertahankan.

  • UniformToFill: Gambar diskalakan sehingga sepenuhnya mengisi area output sambil mempertahankan rasio aspek asli gambar.

Contoh berikut menerapkan setiap enumerasi yang tersedia Stretch ke Image.

Gambar berikut menunjukkan output dari contoh dan menunjukkan pengaruh yang dimiliki pengaturan yang berbeda Stretch saat diterapkan ke gambar.

Different TileBrush Stretch settings
Pengaturan peregangan yang berbeda

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

Melukis dengan Gambar

Gambar juga dapat ditampilkan dalam aplikasi dengan melukis dengan Brush. Kuas memungkinkan Anda melukis objek UI dengan apa pun mulai dari warna yang sederhana dan solid hingga serangkaian pola dan gambar yang kompleks. Untuk melukis dengan gambar, gunakan ImageBrush. ImageBrush adalah jenis TileBrush yang mendefinisikan kontennya sebagai gambar bitmap. Menampilkan ImageBrush satu gambar, yang ditentukan oleh propertinya ImageSource . Anda dapat mengontrol bagaimana gambar direntangkan, diratakan, dan diurutkan, memungkinkan Anda mencegah distorsi dan menghasilkan pola dan efek lainnya. Ilustrasi berikut menunjukkan beberapa efek yang dapat dicapai dengan ImageBrush.

ImageBrush output examples
Kuas gambar dapat mengisi bentuk, kontrol, teks, dan lainnya

Contoh berikut menunjukkan cara melukis latar belakang tombol dengan gambar menggunakan 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>

Untuk informasi tambahan tentang ImageBrush dan melukis gambar, lihat Melukis dengan Gambar, Gambar, dan Visual.

Metadata Gambar

Beberapa file gambar berisi metadata yang menjelaskan konten atau karakteristik file. Misalnya, sebagian besar kamera digital membuat gambar yang berisi metadata tentang pembuatan dan model kamera yang digunakan untuk mengambil gambar. Setiap format gambar menangani metadata secara berbeda tetapi WPF Imaging menyediakan cara yang seragam untuk menyimpan dan mengambil metadata untuk setiap format gambar yang didukung.

Akses ke metadata disediakan melalui Metadata properti BitmapSource objek. MetadataBitmapMetadata mengembalikan objek yang menyertakan semua metadata yang dimuat oleh gambar. Data ini mungkin dalam satu skema metadata atau kombinasi skema yang berbeda. WPF Imaging mendukung skema metadata gambar berikut: File gambar yang dapat ditukar (Exif), tEXt (Data Tekstual PNG), direktori file gambar (IFD), International Press Telecommunications Council (IPTC), dan Extensible Metadata Platform (XMP).

Untuk menyederhanakan proses membaca metadata, BitmapMetadata menyediakan beberapa properti bernama yang dapat dengan mudah diakses seperti Author, , Titledan CameraModel. Banyak dari properti bernama ini juga dapat digunakan untuk menulis metadata. Dukungan tambahan untuk membaca metadata disediakan oleh pembaca kueri metadata. Metode GetQuery ini digunakan untuk mengambil pembaca kueri metadata dengan menyediakan kueri string seperti "/app1/exif/". Dalam contoh berikut, GetQuery digunakan untuk mendapatkan teks yang disimpan di lokasi "/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()

Untuk menulis metadata, penulis kueri metadata digunakan. SetQuery mendapatkan penulis kueri dan menetapkan nilai yang diinginkan. Dalam contoh berikut, SetQuery digunakan untuk menulis teks yang disimpan di lokasi "/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()

Ekstensibilitas Codec

Fitur inti WPF Imaging adalah model ekstensibilitas untuk codec gambar baru. Antarmuka yang tidak dikelola ini memungkinkan pengembang codec untuk mengintegrasikan codec dengan WPF sehingga format gambar baru dapat secara otomatis digunakan oleh aplikasi WPF.

Untuk sampel API ekstensibilitas, lihat Codec Sampel Win32. Sampel ini menunjukkan cara membuat dekoder dan encoder untuk format gambar kustom.

Catatan

Codec harus ditandatangani secara digital agar sistem mengenalinya.

Baca juga