Makale Özeti

Bu makalede dijital bir fotoğraf makinasıyla çekilmiş bir fotoğrafın kaydı sırasında makina tarafından dosyaya oluşturulan bilgileri dosyadan nasıl okuyacağımızı inceleyeceğiz. Bilgilerin tutulduğu kısma exif dosyası denir. Exif dünyaca bir standarttır ve en son v2.2'si mevcuttur.

Makale

         Merhabalar,

         Bu makalede dijital bir fotoğraf makinasıyla çekilmiş bir fotoğrafın kaydı sırasında makina tarafından dosyaya oluşturulan bilgileri dosyadan nasıl okuyacağımızı inceleyeceğiz. Bilgilerin tutulduğu kısma exif dosyası denir. Exif dünyaca bir standarttır ve en son v2.2'si mevcuttur. Bu standartlar hakkında gerekli bilgiyi www.exif.org adresinden okuyabilirsiniz. Biraz daha açık bir tanım yapacak olursak; Bir dijital fotoğrafın sadece görüntü imajından oluşmadığı ve içinde, o fotoğraf hakkında diğer bilgileri de barındırdığını ve bu bilgilere EXIF (Exchangeable Image File) adı verildiğini söylememiz doğru olacaktır.

Temel olarak EXIF bilgileri, fotoğrafın hangi makineyle, ne zaman, hangi fotografik detaylarla çekildiğini, pozlama süresini, diyafram açıklığını ve diğer birçok bilgiyi barındırır. Bu bilgiler, birçok fotoğrafçıya resim üzerinde bilgileri görebildikleri için büyük kolaylıklar sağlamaktadır. Günümüzde piyasadaki tüm dijital kameralar, EXIF bilgilerini kaydederler. EXIF bilgileri, fotoğrafın dosya boyutunu artırdığı için, web ortamında yayımlanan fotoğraflarda bu bilgiler genellikle silinerek dosya boyutu küçültülür.. Profesyonel foto editör programları ile bu detay bilgileri görülebildiği gibi, Windows XP ortamında bile, dosya özelliklerinden bu bilgilere erişilebilir.

        Şimdi ise programımızda okuyacağımız Exif bilgilerinin neler olduğunu ve bunların hangi Id lerle saklandığını inceleyelim

 
Tag ID Değer
271 Kamera Üreticisi Firma
272 Kamera Modeli
274 Oryantasyon
282 Yatay Çözünürlük
283 Dikey Çözünürlük
296 Çözünürlük Birimi
305 Yazılım
306 Tarih
531 YCBCr Pozisyonu
33434 Kare Süresi
33437 F Numarası
34850 Kare Programı
34855 ISO Hızı
36864 Exif Versiyonu
Tag ID Değer
36867 Orjinal Tarih
36868 Dijitalize Edilmiş Tarih
37122 Örnek başı bit
37380 Kare başı bit
37381 Maks Geom Değeri
37383 Uzaklık Modu
37384 Işık Kaynağı
37385 Flaş
37386 Focal Uzunluk
40960 Flaş Versiyonu
40961 Renk Uzayı
40962 Genişlik
40963 Yükseklik
41495 Hassasiyet Modu

         Bu değerleri dosyadan okurken bazı değerler için karşımıza sadece numara ile ifade edilmiş değerler gelmektedir. Bu değerleri ve numaraların ifade ettiği inceleyelim.

         Oryantasyon 

Nümerik Değer Değer
1 Üst-Sol
2 Üst-Sağ
3 Alt-Sağ
4 Alt-Sol
5 Sol-Üst
6 Sağ-Üst
7 Sağ-Alt
8 Sol-Alt

         Kare Programı

Nümerik Değer Değer
0 Belirlenmemiş
1 Manuel
2 Normal
3 Geom Önceliği
4 Objektif Kapağı Önceliği
5 Yaratıcı Program
6 Aksiyon programı
7 Portre Modu
8 Manzara Modu

         Uzaklık Modu

Nümerik Değer Değer
0 Belirsiz
1 Ortalama
2 Orta Ağırlıklı Ortalama
3 Spot
4 Çoklu Spot
5 Çoklu Segment
6 Parçalı

         Çözünürlük Birimi

Nümerik Değer Değer
2 İnç
3 Santimetre

         YBCr Pozisyonu

Nümerik Değer Değer
1 Merkez
2 Başlangıç Noktası

         Işık Kaynağı

Nümerik Değer Değer
0 Otomatik
1 Gün Işığı
2 Florasan
3 Tungsten

         Flaş

Nümerik Değer Değer
0 Flaşsız
1 Flaşlı

         Hassasiyet Modu

Nümerik Değer Değer
1 Belirsiz
2 Bir Çip
3 İki Çip
4 Üç Çip
5 Renk Sıralı Alan
6 Üç Hatlı
7 Renk Sıralı Ve Üç Hatlı

 

          Şimdi bu belirttiğimiz özelliklerdeki nümerik değeleri ve karşılıklarını inceledik ancak bunları programda kullanabileceğimiz hale getirmeliyiz. Bunun için en iyi yöntem Enum kullanmaktır. Nümerik değerlerini temsil eden enum değerlerini yaratıp daha sonrasında ise gelen nümerik değere göre oluşturduğumuz enum değerini String'e çevirerek okumak bizim için çok kolay olacaktır.

         Bu enumları yazacağımız class'ı yazmaya başlayalım.
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace DigitalImageSummaryReader
{
    public class Enums
    {
        public enum enmOrientation
        {
            top_left=1,
            top_right=2,
            bottom_right=3,
            bottom_left=4,
            left_top=5,
            right_top=6,
            right_bottom=7,
            left_bottom=8,
        }
        public static string GetOrientation(Int16 val)
        {
            enmOrientation enm = (enmOrientation)val;
            return enm.ToString();
        }
          Oryantasyon değerlerini tuttuğumuz bu enumda değerleri ingilizce olarak tutuyoruz ve boşluk yerıne _ yazıyoruz. Bunu string'e çevireceğimiz zaman ise bu _ leri boşluk karakteri ile değiştireceğiz. Bunun yanısıra her enum için GetOrientation benzeri bir metod yazacağız ve enum'un nümerik değerini alıp kendisinin string'e çevrilmiş halini bize döndürecek.
 
        public enum enmResolutionUnit
        {
            Inches=2,
            Centimeters=3,
        }
        public static string GetResolutionUnit(Int16 val)
        {
            enmResolutionUnit enm = (enmResolutionUnit)val;
            return enm.ToString();
        }
          Çözünürlük değerlerinin tutulduğu bu enum ve bu değerleri bize string olarak çeviren metodu ilk örnekte olduğuna benzer bir yaklaşımla aynı şekilde yazıyoruz.
 
        public enum enmYCBCrPositioning
        {
            Centered=1,
            Datum_Point=2,
        }
        public static string GetYCBCrPositioning(Int16 val)
        {
            enmYCBCrPositioning enm = (enmYCBCrPositioning)val;
            return enm.ToString();
        }
        public enum enmExposureProgram
        {
            Not_Defined=0,
            Manual=1,
            Normal_Program=2,
            Aperture_Priority=3,
            Shutter_Priority=4,
            Creative_Program=5,
            Action_Program=6,
            Portrait_Mode=7,
            Landscape_Mode=8,
        }
        public static string GetExposureProgram(Int16 val)
        {
            enmExposureProgram enm = (enmExposureProgram)val;
            return enm.ToString();
        }
          Bu iki enum ve metodda ise aynı işlemler YBCr Pozisyonlaması ve Kare Programı ile ilgili değerler için yaplmaktadır. Bu class'ın bu kısımdan sonrası için aynı mantık tekrar edecektir bunun için bu class'a ait kodları buradan sonraki kısımlar için  sadece yazıyor ve açıklama gereği duymuyorum.
 
        public enum enmMeteringMode
        {
            Unknown=0,
            Average=1,
            CenterWeightedAverage=2,
            Spot=3,
            Multi_Spot=4,
            Multi_Segment=5,
            Partial=6,
        }
        public static string GetMeteringMode(Int16 val)
        {
            enmMeteringMode enm = (enmMeteringMode)val;
            return enm.ToString();
        }
        public enum enmLightSource
        {               
            Auto=0,
            Daylight=1,
            Fluorescent=2,
            Tungsten=3,
        }
        public static string GetLightSource(Int16 val)
        {
            enmLightSource enm = (enmLightSource)val;
            return enm.ToString();
        }
        public enum enmFlash
        {
             Flash_was_not_fired=0,
             Flash_was_fired=1,
        }
        public static string GetFlash(Int16 val)
        {
            enmFlash enm = (enmFlash)val;
            return enm.ToString();
        }
        public enum enmSensingMode
        {
            Not_Defined=1,
            One_chip_color_area_sensor=2,
            Two_chip_color_area_sensor=3,
            Three_chip_color_area_sensor=4,
            Color_sequential_area_sensor=5,
            Trilinear_sensor=6,
            Color_sequential_trilinear_area_sensor=7,
        }
        public static string GetSensingMode(Int16 val)
        {
            enmSensingMode enm = (enmSensingMode)val;
            return enm.ToString();
        }
    }
}
          Enumları ve bunların stringe çevrilmesine yarayan metodları barındıran bu class'ımızı yazmayı bitirdikten sonra sıra Resmimizin özelliklerini tutacağımız nesnemizi yazmaya geldi. Bu nesnede hangi özelliğin hangi değeri taşıdığını tutacağız. Bu nesneyi bu makale dizisinin bir sonraki bölümünde yazacağız. Bu makalede Exif'in ne olduğu, ne çeşit bilgileri taşıdığının inceledik ve enum larımızı yazdık.

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com