2011-04-02 58 views
4

我有一堆圖像文件(主要是.jpg)。我想存儲關於這些文件的元數據(例如主色,顏色分佈,最大梯度流場,興趣點等等)。這些數據字段不固定,並不適用於所有圖像。將文件元數據存儲在額外文件中

現在我存儲每個文件具有相同名稱的單獨文件,但使用不同的擴展元數據。格式只是文本:

metadataFieldName1 metadataFieldValue1 
metadataFieldName2 metadataFieldValue2 

這讓我想知道,有沒有更好/更簡單的方式來存儲這些元數據?我想到了ProtocolBuffer,因爲我需要能夠用C++和Python讀寫這些信息。但是,如何支持某些元數據不可用的情況?

+0

你看過boost序列化基礎設施嗎?它相當適合蟒蛇。 – 2011-04-02 15:28:34

回答

0

我想了很久在這個問題上,並與ProtocolBuffer去爲我的圖像存儲元數據。對於每個圖像例如Image00012.jpg,我將元數據存儲在Image00012.jpg.pbmd中。一旦我有我的.proto文件設置,Python類和C++類自動生成。它工作得很好,需要我花費很少的時間來解析(顯然比爲YAML文件編寫自定義閱讀器更好)。

RestRisiko帶來了約,我應該如何處理不可用元數據的好點。 ProtocolBuffer的好處是支持可選/必填字段。這解決了我在這方面的問題。

究其原因,我認爲XML和INI不利於這個目的是因爲很多我的元數據是複雜的(顏色分佈,......),並需要一些存儲定製。 ProtocolBuffer允許我嵌套proto聲明。另外,元數據文件的大小和解析速度明顯優於我的手寫XML讀/寫。

1

爲什麼協議緩衝區而不是XML或INI文件或任何文本格式?只是選擇一些格式...

你是什麼意思與「元數據不可用」?應對這種錯誤情況取決於您的應用程序......這與存儲的格式有什麼關係?

0

http://www.yaml.org。 YAML不像XML那樣冗長,而且更易於閱讀。

有兩個C++,Python和許多其他語言YAML庫。

例子:

import yaml 

data = { "field1" : "value1", 
     "field2" : "value2" } 

serializedData = yaml.dump(data, default_flow_style=False) 

open("datafile", "w").write(serializedData) 
+0

YAML很好,但上次我檢查它涉及到相當多的編碼。你有YAML圖書館的建議嗎? – 2011-04-02 15:53:58

+0

Python的PyYAML。看到我添加的代碼示例到編輯的答案,它需要很少的代碼行。 – Ulrik 2011-04-02 16:19:32

+0

對於傾銷是的,但對於讀回到struct的C++向量中並不簡單。 – 2011-04-03 04:03:56

2

我建議你存儲這些元數據中的圖片文件本身。

大多數圖片格式都支持存儲元數據。我認爲.jpeg通過Exif支持它。

如果您使用的是Windows,你可以使用WIC來存儲和在unified manner檢索元數據。

+0

我已經考慮過EXIF,但我的很多圖片都不是jpg格式。另外我不在Windows上。 – 2011-04-02 15:53:12