2010-11-16 83 views
1

我搜集EXIF數據的光統計收集了大量的照片和從可用數據翻譯曝光時間值/我想找到最簡單的方法(即性能沒有關係)。有(只要我能找到),用於什麼樣的價值觀相機制造商可能會使用即我不能只掃描隨機圖像和硬編碼的地圖網還沒有標準。如何將快門速度值轉換爲可用數據?

下面是是我所遇到的值的樣本集(表示秒):

279」,30" ,5" ,3.2" ,1.6" ,1.3" ,1" ,1/1.3,1/1.6,1/2,1/2.5,1/3,1/1,1/5,1/8,1/13,1/8000,1/16000

同時考慮到我也想找到平均值(mean)...但它應該是收集實際快門速度的一個,而不是隻是一些任意數量。

編輯: 通過可用數據我的意思是某種形式的創意?編號系統,我可以將其轉換爲/從中執行計算。我想只是把所有東西都乘以1,000,000,除了一些分數是相當奇特的。爲了澄清,我使用的是ExposureTime而不是ShutterSpeed,因爲它包含攝影師友好的值例如, 1/50。 ShutterSpeed更像是一種近似值(相機制造商之間會有所不同),並導致諸如1/49的值。

+6

你是什麼可用的數據是什麼意思? – Lagerbaer 2010-11-16 17:45:58

+0

您是否在說像絃樂一樣獲得快門速度,如「1/1.6」?你如何獲得這些價值? – Gabe 2010-11-16 17:50:52

+1

@Gabe他讓他們通過EXIF元數據,所以他們是字符串,是的。 – 2010-11-16 17:52:42

回答

2

你想要把它解析爲某種時間持續時間的對象。

一種簡單的方法,在看這些數據,將是檢查wheter「或/發生時,如果」解析爲秒,/解析爲秒級分。我真的不明白你還有什麼意思。舉個例子,你需要指定一種語言 - 另外,可能已經有一個解析器了。

+0

語言是C#/ NET 3.5(如關鍵字中所列)。我按照你的建議解析,然而這些分數很難轉換爲/來自例如1/1.3或1/3。 – glenneroo 2010-11-16 18:03:37

+1

將它們存儲在查找表(如哈希表或詞典)中。使用表格在字符串(用於用戶顯示或用於EXIF交換)和用於任何數學計算的雙精度之間進行轉換。 – Les 2010-11-16 18:23:37

+0

@ Les,Sheeo您的答案是顯而易見的和/或IMO「正常」答案。回想起來,我想我的腦海裏一直在暗中尋找一些聰明的新的.NET 3.x語言功能。愚蠢的我,堅持什麼工作或至少在我的問題中指定我的意圖。 – glenneroo 2010-11-17 16:53:13

1

快門速度在EXIF元數據作爲一個SRATIONAL,32位爲分子和32位爲分母編碼。示例代碼檢索它,使用System.Drawing中:

 var bmp = new Bitmap(@"c:\temp\canon-ixus.jpg"); 
     if (bmp.PropertyIdList.Contains(37377)) { 
      byte[] spencoded = bmp.GetPropertyItem(37377).Value; 
      int numerator = BitConverter.ToInt32(spencoded, 0); 
      int denominator = BitConverter.ToInt32(spencoded, 4); 
      Console.WriteLine("Shutter speed = {0}/{1}", numerator, denominator); 
     } 

輸出:快門速度=65536分之553859,樣本圖像retrieved here

+0

我使用EXPOSURETIME代替,因爲ShutterSpeed給出的值有點_too_準確。我更喜歡熟悉的1/50而不是1/49的_actual_值。 – glenneroo 2010-11-16 18:30:50

+0

好的,無論你喜歡什麼。這回答了你的問題了嗎? – 2010-11-16 18:41:47

+0

可悲的是沒有。我已經解析了EXIF數據,我只是想用一些非常簡單的方法來處理它。 – glenneroo 2010-11-16 18:44:25

1

似乎有三種類型的字符串,你會遇到:

  1. 字符串用雙引號"爲秒
  2. 字符串與領先1/
  3. 字符串沒有特殊字符

我建議你簡單地測試這些條件並使用浮點數相應地解析數值:

string[] InputSpeeds = new[] { "279\"", "30\"", "5\"", "3.2\"", "1.6\"", "1.3\"", "1\"", "1/1.3", "1/1.6", "1/2", "1/2.5", "1/3", "1/4", "1/5", "1/8", "1/13", "1/8000", "1/16000" }; 
    List<float> OutputSpeeds = new List<float>(); 

    foreach (string s in InputSpeeds) 
    { 
     float ConvertedSpeed; 
     if (s.Contains("\"")) 
     { 
      float.TryParse(s.Replace("\"", String.Empty), out ConvertedSpeed); 
      OutputSpeeds.Add(ConvertedSpeed); 
     } 
     else if (s.Contains("1/")) 
     { 
      float.TryParse(s.Remove(0, 2), out ConvertedSpeed); 
      if (ConvertedSpeed == 0) 
      { 
       OutputSpeeds.Add(0F); 
      } 
      else 
      { 
       OutputSpeeds.Add(1/ConvertedSpeed); 
      } 
     } 
     else 
     { 
      float.TryParse(s, out ConvertedSpeed); 
      OutputSpeeds.Add(ConvertedSpeed); 
     } 
    } 

如果你想TimeSpan。只不過改變List<float>List<TimeSpan>和代替將浮到列表,使用TimeSpan.FromSeconds(ConvertedSpeed);

+0

哦,謝謝,我完全忘了TimeSpan!解析器也很好用! :) – glenneroo 2010-11-17 19:59:06