Översikt över avbildning
Det här avsnittet innehåller en introduktion till Microsoft Windows Presentation Foundation Imaging-komponenten. MED WPF Imaging kan utvecklare visa, transformera och formatera bilder.
komponent för WPF Imaging
WPF Imaging ger betydande förbättringar av avbildningsfunktionerna i Microsoft Windows. Avbildningsfunktioner, till exempel att visa en bitmapp eller använda en bild på en gemensam kontroll, var tidigare beroende av Microsoft Windows Graphics Device Interface (GDI) eller Microsoft Windows GDI+-bibliotek. Dessa API tillhandahåller baslinjeavbildningsfunktioner, men saknar funktioner som stöd för utökningsbarhet och bildstöd med hög återgivning. WPF Imaging är utformat för att lösa bristerna i GDI och GDI+ och tillhandahålla en ny uppsättning API för att visa och använda bilder i dina program.
Det finns två sätt att komma åt WPF Imaging-API:et, en hanterad komponent och en ohanterad komponent. Den ohanterade komponenten innehåller följande funktioner.
Utökningsmodell för nya eller egna bildformat.
Förbättrad prestanda och säkerhet för inbyggda bildformat, inklusive bitmapp (BMP), Joint Photographics Experts Group (JPEG), Portable Network Graphics (PNG), Tagged Image File Format (TIFF), Microsoft Windows Media Photo, Graphics Interchange Format (GIF) och ikon (.ico).
Bevarande av hög bitdjup bilddata upp till 8 bitar per kanal (32 bitar per pixel).
Icke-förstörande bildskalning, beskärning och rotationer.
Förenklad färghantering.
Stöd för in-file, proprietära metadata.
Den hanterade komponenten använder den ohanterade infrastrukturen för att ge sömlös integrering av bilder med andra WPF-funktioner som användargränssnitt ,animering och grafik. Den hanterade komponenten drar också nytta av utökningsmodellen för Windows Presentation Foundation (WPF) avbildningskodextensibilitet som möjliggör automatisk igenkänning av nya bildformat i WPF-program.
Majoriteten av det hanterade WPF Imaging-API:et finns i System.Windows.Media.Imaging namnområde, men flera viktiga typer, till exempel ImageBrush och ImageDrawing finns i System.Windows.Media namnområde och Image finns i System.Windows.Controls namnrymd.
Det här avsnittet innehåller ytterligare information om den hanterade komponenten. Mer information om det ohanterade API:t finns i dokumentationen Ohanterad WPF Imaging Component.
WPF-bildformat
En codec används för att avkoda eller koda ett visst medieformat. WPF Imaging innehåller en codec för bildformaten BMP, JPEG, PNG, TIFF, Windows Media Photo, GIF och ICON. Var och en av dessa codecs gör det möjligt för program att avkoda och, med undantag för ICON, koda sina respektive bildformat.
BitmapSource är en viktig klass som används i avkodning och kodning av bilder. Det är den grundläggande byggstenen i WPF Imaging-pipelinen och representerar en enda konstant uppsättning bildpunkter med en viss storlek och upplösning. En BitmapSource kan vara en enskild bildruta i en bildruta med flera bilder, eller så kan det vara resultatet av en transformering som utförs på en BitmapSource. Det är överordnat för många av de primära klasser som används i WPF-avbildning, till exempel BitmapFrame.
En BitmapFrame används för att lagra faktiska bitmappsdata i ett bildformat. Många bildformat stöder bara en enda BitmapFrame, även om format som GIF och TIFF stöder flera bildrutor per bild. Ramar används av avkodare som indata och skickas till kodare för att skapa bildfiler.
I följande exempel visas hur en BitmapFrame skapas från en BitmapSource och sedan läggs till i en TIFF-avbildning.
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)
Avkodning av bildformat
Avkodning av bilder är översättningen av ett bildformat till bilddata som kan användas av systemet. Bilddata kan sedan användas för att visa, bearbeta eller koda till ett annat format. Valet av avkodare baseras på bildformatet. Codec-markeringen är automatisk om inte en specifik avkodare har angetts. Exemplen i avsnittet Visa bilder i WPF visar automatisk avkodning. Anpassade formatdekodare som utvecklats med hjälp av de ohanterade WPF Imaging-gränssnitten och som registrerats med systemet deltar automatiskt i valet av avkodare. Detta gör att anpassade format kan visas automatiskt i WPF-program.
I följande exempel visas hur en bitmappsavkodare används för att avkoda en BMP-formatbild.
// 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)
Bildformatkodning
Bildkodning är översättningen av bilddata till ett visst bildformat. De kodade bilddata kan sedan användas för att skapa nya avbildningsfiler. WPF Imaging tillhandahåller kodare för var och en av de bildformat som beskrivs ovan.
I följande exempel visas hur en kodare används för att spara en nyskapad bitmappsbild.
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)
Visa bilder i WPF
Det finns flera sätt att visa en bild i ett WPF-program (Windows Presentation Foundation). Bilder kan visas med hjälp av en Image kontroll, målas på ett visuellt objekt med hjälp av en ImageBrusheller ritas med hjälp av en ImageDrawing.
Använda bildkontrollen
Image är ett ramverkselement och det primära sättet att visa bilder i program. I XAML kan Image användas på två sätt. attributsyntax eller egenskapssyntax. I följande exempel visas hur du återger en bild som är 200 bildpunkter bred med både attributsyntax och egenskapstaggsyntax. Mer information om attributsyntax och egenskapssyntax finns i Översikt över beroendeegenskaper.
<!-- 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>
Många av exemplen använder ett BitmapImage-objekt för att referera till en bildfil. BitmapImage är en specialiserad BitmapSource som är optimerad för XAML-inläsning (Extensible Application Markup Language) och är ett enkelt sätt att visa bilder som Source för en Image kontroll.
I följande exempel visas hur du återger en bild som är 200 bildpunkter bred med hjälp av kod.
Not
BitmapImage implementerar ISupportInitialize-gränssnittet för att optimera initieringen av flera egenskaper. Egenskapsändringar kan bara ske under objektinitiering. Anropa BeginInit för att signalera att initieringen har påbörjats och EndInit för att signalera att initieringen har slutförts. När de har initierats ignoreras egenskapsändringar.
// 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
Rotera, konvertera och beskära bilder
WPF gör det möjligt för användare att transformera bilder med hjälp av egenskaper för BitmapImage eller med hjälp av ytterligare BitmapSource objekt som CroppedBitmap eller FormatConvertedBitmap. Dessa bildtransformeringar kan skala eller rotera en bild, ändra bildpunktsformatet för en bild eller beskära en bild.
Bildrotationer utförs med egenskapen Rotation för BitmapImage. Rotationer kan bara göras i steg om 90 grader. I följande exempel roteras en bild 90 grader.
<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
Konvertera en bild till ett annat pixelformat, till exempel gråskala, görs med hjälp av FormatConvertedBitmap. I följande exempel konverteras en bild till 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
Om du vill beskära en bild kan antingen egenskapen Clip för Image eller CroppedBitmap användas. Om du bara vill visa en del av en bild bör Clip vanligtvis användas. Om du behöver koda och spara en beskuren bild ska CroppedBitmap användas. I följande exempel beskärs en bild med egenskapen Clip med hjälp av en 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
Stretchbilder
Egenskapen Stretch styr hur en avbildning sträcks ut för att fylla containern. Egenskapen Stretch accepterar följande värden som definieras av Stretch uppräkning:
None: Bilden är inte utsträckt för att täcka utskriftsområdet. Om bilden är större än utdataområdet ritas bilden i utdataområdet och delar som inte passar visas inte.
Fill: Bilden skalas för att passa utdataområdet. Eftersom bildhöjden och bredden skalas separat kan det ursprungliga bildförhållandet kanske inte bevaras. Det innebär att bilden kan förvrängas för att helt fylla utgångsbehållaren.
Uniform: Bilden skalas så att den passar helt inom utdataområdet. Bildens proportion bevaras.
UniformToFill: Bilden skalas så att den helt fyller utdataområdet samtidigt som bildens ursprungliga proportion bevaras.
I följande exempel tillämpas var och en av de tillgängliga Stretch uppräkningar på en Image.
Följande bild visar utdata från exemplet och visar vilken inverkan de olika Stretch inställningarna har när de tillämpas på en bild.
Olika stretchinställningar
<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>
Måla med bilder
Bilder kan också visas i ett program genom att måla med en Brush. Med penslar kan du måla gränssnittsobjekt med allt från enkla, solida färger till komplexa uppsättningar mönster och bilder. Om du vill måla med bilder använder du en ImageBrush. En ImageBrush är en typ av TileBrush som definierar innehållet som en bitmappsbild. En ImageBrush visar en enda bild som anges av egenskapen ImageSource. Du kan styra hur bilden är utsträckt, justerad och kaklad, så att du kan förhindra förvrängning och skapa mönster och andra effekter. Följande bild visar några effekter som kan uppnås med en ImageBrush.
Bildpenslar kan fylla former, kontroller, text med mera
I följande exempel visas hur du målar upp en knapps bakgrund med en bild med hjälp av en 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>
Mer information om ImageBrush- och målningsbilder finns i Målning med bilder, ritningar och visuella objekt.
Bildmetadata
Vissa bildfiler innehåller metadata som beskriver innehållet eller egenskaperna för filen. De flesta digitalkameror skapar till exempel bilder som innehåller metadata om kamerans märke och modell som används för att avbilda bilden. Varje bildformat hanterar metadata på olika sätt, men WPF Imaging ger ett enhetligt sätt att lagra och hämta metadata för varje bildformat som stöds.
Åtkomst till metadata tillhandahålls via egenskapen Metadata för ett BitmapSource objekt. Metadata returnerar ett BitmapMetadata objekt som innehåller alla metadata som finns i bilden. Dessa data kan finnas i ett metadataschema eller en kombination av olika scheman. WPF Imaging stöder följande bildmetadatascheman: Exchangeable image file (Exif), tEXt (PNG Textual Data), image file directory (IFD), International Press Telecommunications Council (IPTC) och Extensible Metadata Platform (XMP).
För att förenkla läsningen av metadata tillhandahåller BitmapMetadata flera namngivna egenskaper som enkelt kan nås, till exempel Author, Titleoch CameraModel. Många av dessa namngivna egenskaper kan också användas för att skriva metadata. Ytterligare stöd för att läsa metadata tillhandahålls av metadatafrågeläsaren. Metoden GetQuery används för att hämta en metadatafrågasläsare genom att ange en strängfråga som "/app1/exif/". I följande exempel används GetQuery för att hämta texten som lagras på "/Text/Beskrivning" plats.
// 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()
För att skriva metadata används en metadatafrågeskrivare. SetQuery hämtar frågeskrivaren och anger önskat värde. I följande exempel används SetQuery för att skriva texten som lagras på "/Text/Beskrivning" plats.
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()
Utökningsbarhet för codec
En viktig funktion i WPF Imaging är utökningsmodellen för nya bildkodare. Dessa ohanterade gränssnitt gör det möjligt för codec-utvecklare att integrera codecs med WPF så att nya bildformat automatiskt kan användas av WPF-program.
Ett exempel på utöknings-API:et finns i Win32 Sample Codec. Det här exemplet visar hur du skapar en avkodare och kodare för ett anpassat bildformat.
Not
Codec måste vara digitalt signerad för att systemet ska kunna identifiera den.
Se även
.NET Desktop feedback