posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

WPF: BitmapMetadata. Read and Write.

Può capitare di creare applicazioni (nello specifico WPF) che hanno necessità di leggere e scrivere i principali metadati, come autore/i , titolo e soggetto, di foto e/o immagini. L’operazione di lettura è molto semplice, e si riduce in qualche riga di codice:

   1: string imagePath = @"image_path";
   2: Stream readerBitampStream = new System.IO.FileStream(imagePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
   3: BitmapDecoder decoder = BitmapDecoder.Create(readerBitampStream, BitmapCreateOptions.None, BitmapCacheOption.Default);
   4: BitmapFrame frame = decoder.Frames[0];
   5: BitmapMetadata frameMetadata = (BitmapMetadata)decoder.Frames[0].Metadata;
   6:  
   7: ////Show Title and Camera Model.
   8: string imageMetadataString = string.Format("Title: {0}, Camera Model: {1}", frameMetadata.Title, frameMetadata.CameraModel);
   9: MessageBox.Show(imageMetadataString);
  10: readerBitampStream.Close();

La scrittura invece è leggermente più complessa:

   1: using (Stream writerbitmapStream = new System.IO.FileStream(imagePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
   2: {
   3:     BitmapDecoder bitmapDecoder = JpegBitmapDecoder.Create(writerbitmapStream, BitmapCreateOptions.None, BitmapCacheOption.Default);
   4:     BitmapEncoder bitmapEncoder = new JpegBitmapEncoder();
   5:     BitmapFrame bitmapFrame = bitmapDecoder.Frames[0];
   6:     BitmapMetadata bitmapMetadata = bitmapFrame.Metadata.Clone() as BitmapMetadata;
   7:  
   8:     System.Collections.ObjectModel.ReadOnlyCollection<string> autori =
   9:         new System.Collections.ObjectModel.ReadOnlyCollection<string>(
  10:         new List<string>(new string[] { "Pietro Libro", "Pinco Pallino" }));
  11:     System.Collections.ObjectModel.ReadOnlyCollection<string> keywords =
  12:         new System.Collections.ObjectModel.ReadOnlyCollection<string>(
  13:         new List<string>(new string[] { "Desert", "Sand" ,"Enviroment"}));
  14:  
  15:     bitmapMetadata.Title = "Desert";
  16:     bitmapMetadata.Copyright = "Copyright 123.";
  17:     bitmapMetadata.Author = autori;
  18:     bitmapMetadata.Keywords = keywords;
  19:     bitmapMetadata.Rating = 100;
  20:     bitmapMetadata.Subject = "---";
  21:     bitmapMetadata.Rating = 5;
  22:     bitmapMetadata.ApplicationName = "Custom WPF Application";
  23:     bitmapMetadata.CameraModel = "Camera Brand 5600";
  24:     bitmapMetadata.CameraManufacturer = "Brand";
  25:  
  26:     bitmapEncoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, bitmapMetadata, bitmapFrame.ColorContexts));
  27:  
  28:     using (Stream outputFile = File.Open(@"path_output", FileMode.Create, FileAccess.ReadWrite))
  29:     {
  30:         bitmapEncoder.Save(outputFile);
  31:     }
  32:     writerbitmapStream.Close();
  33: }

In pratica bisogna eseguire una clonazione delle proprietà contenute nel primo frame (stiamo considerando immagine statiche), modificare le informazioni che vogliamo e riscrivere il file di immagine utilizzando i metadata modificati. Eseguendo il codice sopra riportato, se visualizziamo la finestra delle proprietà di Windows per il file creato, otteniamo:

image

Un altro metodo per eseguire la scrittura dei metadata è l’utilizzo del metodo CreateInPlaceBitmapMetadataWriter() della classe BitmapFrame, ma sinceramente ho avuto qualche problema nell’utilizzo e per il momento ho optato per questa seconda opzione (argomento da approfondire).

Piccola nota, se si utilizza la classe ImageSource per accedere direttamente ai metadata di un’immagine, come nell’esempio seguente:

   1: BitmapImage image = new BitmapImage(new Uri("image_Path"));
   2: MessageBox.Show((image.Metadata as BitmapMetadata).Title);

Viene sollevata un’eccezione di tipo NotSupportedException.

Print | posted on venerdì 13 agosto 2010 15:29 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET