Cumartesi, Ekim 27, 2007

C# ile EXIF Bilgilerini Okuma.

JPG dosyalarının içinde fotoğraf ile ilgili birçok bilgi bulunur. EXIF bilgileri genellikle fotoğrafın hangi ayarlarda çekildiğini anlamak için kullanılsa da JPEG dosyası içerisinde çok daha detaylı bilgiler bulunmaktadır. C# ile bu bilgileri okumak çok kolaydır. Image sınıfı işe yarayacak temel fonksiyonları içerir. Image.PropertyIdList özelliği dosyaya gömülü bilgilerin Id numaralarını içeren bir liste döndürür. PropertyItem sınıfının ilgili EXIF bilgisini ve değerini okumak için kullanacağımız dört özelliği vardır. Id özelliği ilgili bilginin standart numarasıdır. Örneğin Id değeri "0x010F" olan PropertyItem nesnesinden Fotoğrafın çekildiği kameranın adını okuyabiliriz. Bunu okuayabilmek için Value özelliğini kullanırız. Value özelliği, uzunluğunu Len özelliğinden okuyabileceğimiz bir Byte Array'dir. Value değerinin tipini ise Type özelliğinden okuyabiliriz. Örneğin Type 2 ise bilgi ASCII tipinde, 3 ise Short Integer tipindedir.

Hangi Id'nin hangi değere karşılık geldiğini bilebilmek için Mark Michaelis isimli arkadaşın GDIConstants.h dosyasından ayıklayarak hazırladığı ImagePropertyIDTags Enumeration sınıfını kullanacağız. Uzun bir dosya olduğu için burada vermeyeceğim. Buradan indirebilirsiniz. Aynı dosya içersinde Type değerinin neye karşılık geldiğini anlayabileceğimiz bir ImagePropertyTypes Enumeration sınıfı da var. Örnek kodumuzda bu Enumeration değerlerinden faydalanacağız. Kodumuz vereceğimiz dosya isminden JPEG dosyayı yükleyerek özelliklerini bir String listesi olarak döndürecek.

static class ExifExtractor
{
public static IList ExifListesiniAl(string dosyaAdi)
{
IList degerListesi = new List();
Image imaj = new Bitmap(dosyaAdi);
foreach (int id in imaj.PropertyIdList)
{
string deger = string.Empty;
try
{
PropertyItem ozellik = imaj.GetPropertyItem(id);
for (int i = 0; i < (ozellik.Len - 1); i++)

{
if (((char)ozellik.Value[i]) != '\n')
deger += (char)ozellik.Value[i];
}
deger = string.Format("{0} = {1}", (ImagePropertyIDTags)ozellik.Id, deger);
}
catch (Exception e)
{
deger = string.Format("{0} numaralı özelliği okurken {1} hatası oldu.", id, e.Message);
}
degerListesi.Add(deger);
}
return degerListesi;
}
}

Bu basit örnek kodu sadece olayın temel mantığını gösterebilmek için verdim. Artık JPEG dosyasından okumak istediğiniz değerleri nerede kullanmak istiyorsanız ona göre değiştirebilirsiniz.

Hiç yorum yok: