Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, görüntü meta verileri özelliklerini okuma ve yazma ve GeotagHelper yardımcı programı sınıfını kullanarak dosyaları coğrafi olarak etiketlemeyi gösterir.
Görüntü özellikleri
StorageFile.Properties özelliği, dosya hakkında içerikle ilgili bilgilere erişim sağlayan bir StorageItemContentProperties nesnesi döndürür. GetImagePropertiesAsync'i çağırarak görüntüye özgü özellikleri alın. Döndürülen ImageProperties nesnesi, görüntünün başlığı ve yakalama tarihi gibi temel görüntü meta veri alanlarını içeren üyeleri kullanıma sunar.
private async void GetImageProperties(StorageFile imageFile)
{
ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();
string title = props.Title;
if (title == null)
{
// Format does not support, or image does not contain Title property
}
DateTimeOffset dateTaken = props.DateTaken;
}
Daha büyük bir dosya meta verileri kümesine erişmek için, benzersiz bir dize tanımlayıcısı ile alınabilen bir dizi dosya meta verisi özelliği olan Windows Özellik Sistemi'ni kullanın. Dizelerin listesini oluşturun ve almak istediğiniz her özelliğin tanımlayıcısını ekleyin. ImageProperties.RetrievePropertiesAsync yöntemi bu dize listesini alır ve anahtarın özellik tanımlayıcısı ve değerin özellik değeri olduğu anahtar/değer çiftleri sözlüğü döndürür.
private async void GetWindowsProperties(StorageFile imageFile)
{
ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();
var requests = new System.Collections.Generic.List<string>();
requests.Add("System.Photo.Orientation");
requests.Add("System.Photo.Aperture");
IDictionary<string, object> retrievedProps = await props.RetrievePropertiesAsync(requests);
ushort orientation;
if (retrievedProps.ContainsKey("System.Photo.Orientation"))
{
orientation = (ushort)retrievedProps["System.Photo.Orientation"];
}
double aperture;
if (retrievedProps.ContainsKey("System.Photo.Aperture"))
{
aperture = (double)retrievedProps["System.Photo.Aperture"];
}
}
Her özelliğin tanımlayıcıları ve türü dahil olmak üzere Windows Özelliklerinin tam listesi için bkz. Windows Properties.
Bazı özellikler yalnızca belirli dosya kapsayıcıları ve görüntü codec'leri için desteklenir. Her görüntü türü için desteklenen görüntü meta verilerinin listesi için bkz. Fotoğraf Meta Veri İlkeleri.
Desteklenmeyen özellikler alındığında null değer döndürebileceğinden, döndürülen meta veri değerini kullanmadan önce her zaman null değerini denetleyin.
Coğrafi etiket yardımcısı
GeotagHelper, meta veri biçimini el ile ayrıştırmaya ya da oluşturmaya gerek kalmadan, görüntüleri doğrudan Windows.Devices.Geolocation API'lerini kullanarak coğrafi verilerle etiketlemeyi kolaylaştıran bir yardımcı sınıftır.
Görüntüde etiketlemek istediğiniz konumu temsil eden bir Geopoint nesneniz zaten varsa, bunu ister coğrafi konum API’lerini daha önce kullanmanızdan ister başka bir kaynaktan edinmiş olun, GeotagHelper.SetGeotagAsync yöntemini çağırıp bir StorageFile ve Geopoint geçirerek coğrafi etiket verilerini ayarlayabilirsiniz.
private async void SetGeoDataFromPoint(StorageFile imageFile)
{
var point = new Geopoint(
new BasicGeoposition
{
Latitude = 48.8567,
Longitude = 2.3508,
});
await GeotagHelper.SetGeotagAsync(imageFile, point);
}
Cihazın mevcut konumunu kullanarak coğrafi etiket verilerini ayarlamak için yeni bir Geolocator nesnesi oluşturun ve GeotagHelper.SetGeotagFromGeolocatorAsync yöntemini, Geolocator nesnesini ve etiketlenecek dosyayı geçirerek çağırın.
private async void SetGeoDataFromGeolocator(StorageFile imageFile)
{
var locator = new Geolocator();
// Shows the user consent UI if needed
var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus == GeolocationAccessStatus.Allowed)
{
await GeotagHelper.SetGeotagFromGeolocatorAsync(imageFile, locator);
}
}
SetGeotagFromGeolocatorAsync API'sini kullanmak için uygulama bildiriminize konum cihazı özelliğini eklemeniz gerekir.
Kullanıcının uygulamanıza konumunu kullanma izni verdiğinden emin olmak için SetGeotagFromGeolocatorAsync çağrısından önce RequestAccessAsync'i çağırmanız gerekir.
Coğrafi konum ve harita API'leri hakkında daha fazla bilgi için bkz. Harita denetimi.
Bir görüntü dosyasının coğrafi etiketli konumunu temsil eden bir GeoPoint almak için GetGeotagAsync'i çağırın.
private async void GetGeoData(StorageFile imageFile)
{
Geopoint geoPoint = await GeotagHelper.GetGeotagAsync(imageFile);
}
Görüntü meta verilerinin kodunu çözme ve kodlama
Görüntü verileriyle çalışmanın en gelişmiş yolu, BitmapDecoder veya BitmapEncoder kullanarak özellikleri akış düzeyinde okumak ve yazmaktır. Bu işlemler için, okumakta veya yazmakta olduğunuz verileri belirtmek için Windows Özellikleri'ni kullanabilirsiniz, ancak istenen özelliğin yolunu belirtmek için Windows Görüntüleme Bileşeni (WIC) tarafından sağlanan meta veri sorgu dilini de kullanabilirsiniz.
Bu tekniği kullanarak görüntü meta verilerini okumak için kaynak görüntü dosyası akışıyla oluşturulmuş bir BitmapDecoder gerekir. Bunun nasıl yapılacağını öğrenmek için bkz. Bit eşlem görüntüleri oluşturma, düzenleme ve kaydetme.
Kod çözücüye sahip olduktan sonra bir dize listesi oluşturun ve Windows Özellik tanımlayıcı dizesini veya WIC meta veri sorgusunu kullanarak almak istediğiniz her meta veri özelliği için yeni bir giriş ekleyin. Belirtilen özellikleri talep etmek için kod çözücünün BitmapProperties üyesi üzerinde BitmapPropertiesView.GetPropertiesAsync yöntemini çağırın. Özellikler, özellik adını veya yolunu ve özellik değerini içeren anahtar/değer çiftlerinin sözlüğünde döndürülür.
private async void ReadImageMetadata(BitmapDecoder bitmapDecoder)
{
var requests = new System.Collections.Generic.List<string>();
requests.Add("System.Photo.Orientation"); // Windows property key for EXIF orientation
requests.Add("/xmp/dc:creator"); // WIC metadata query for Dublin Core creator
try
{
var retrievedProps = await bitmapDecoder.BitmapProperties.GetPropertiesAsync(requests);
ushort orientation;
if (retrievedProps.ContainsKey("System.Photo.Orientation"))
{
orientation = (ushort)retrievedProps["System.Photo.Orientation"].Value;
}
string creator;
if (retrievedProps.ContainsKey("/xmp/dc:creator"))
{
creator = (string)retrievedProps["/xmp/dc:creator"].Value;
}
}
catch (Exception err)
{
switch (err.HResult)
{
case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
// The file format does not support the requested metadata.
break;
case unchecked((int)0x88982F81): // WINCODEC_ERR_UNSUPPORTEDOPERATION
// The file format does not support any metadata.
default:
throw;
}
}
}
WIC meta veri sorgu dili ve desteklenen özellikler hakkında bilgi için bkz. WIC görüntü biçimi yerel meta veri sorguları.
Birçok meta veri özelliği yalnızca görüntü türlerinin bir alt kümesi tarafından desteklenir. İstenen özelliklerden biri kod çözücüyle ilişkili görüntü tarafından desteklenmiyorsa GetPropertiesAsync 0x88982F41 hata koduyla başarısız olur ve görüntü meta verileri hiç desteklemiyorsa 0x88982F81. Bu hata kodlarıyla ilişkili sabitler, WINCODEC_ERR_PROPERTYNOTSUPPORTED ve WINCODEC_ERR_UNSUPPORTEDOPERATION'dır ve winerror.h başlık dosyasında tanımlanmıştır.
Bir görüntü belirli bir özellik için bir değer içerebileceği gibi içermeyebilir de; bu nedenle, bir özelliğe erişmeye çalışmadan önce sonuçlarda bulunduğunu doğrulamak için IDictionary.ContainsKey kullanın.
Akışa görüntü meta verileri yazmak için görüntü çıktı dosyasıyla ilişkilendirilmiş bir BitmapEncoder gerekir.
Ayarlamak istediğiniz özellik değerlerini içerecek bir BitmapPropertySet nesnesi oluşturun. Özellik değerini göstermek için bir BitmapTypedValue nesnesi oluşturun. Bu nesne, değerin türünü tanımlayan PropertyType numaralandırmasının değeri ve üyesi olarak object kullanır. BitmapTypedValue değerini BitmapPropertySet'e ekleyin ve kodlayıcının özellikleri akışa yazmasına neden olmak için BitmapProperties.SetPropertiesAsync öğesini çağırın.
private async void WriteImageMetadata(BitmapEncoder bitmapEncoder)
{
var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
var orientationValue = new Windows.Graphics.Imaging.BitmapTypedValue(
1, // Defined as EXIF orientation = "normal"
Windows.Foundation.PropertyType.UInt16);
propertySet.Add("System.Photo.Orientation", orientationValue);
try
{
await bitmapEncoder.BitmapProperties.SetPropertiesAsync(propertySet);
}
catch (Exception err)
{
switch (err.HResult)
{
case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
// The file format does not support this property.
break;
default:
throw;
}
}
}
Hangi görüntü dosyası türleri için hangi özelliklerin desteklendiği hakkında ayrıntılı bilgi için bkz. Windows Properties, Photo Metadata Policies ve WIC görüntü biçimi yerel meta veri sorguları.
İstenen özelliklerden biri kodlayıcıyla ilişkili görüntü tarafından desteklenmiyorsa SetPropertiesAsync 0x88982F41 hata koduyla başarısız olur.
İlgili konular
Windows developer