0

.netフレームワークを使用して、jpgファイルからexifメタデータを読み取ります。問題は、PropertyItem.Value(つまりバイト配列)を文字列などの読み取り可能な形式に変換する方法です。

たとえば、このコードを使用して、画像のGPSAltitude値を読み取ります。

        var pic = System.Drawing.Image.FromFile(@"c:\mypic.jpg");
        var GPSAltitude = pic.GetPropertyItem(6);

GPSAltitude.Valueは、{75,2,0,0,1,0,0,0}のようなバイト配列です。

高度が587mslであることは知っていますが、そのバイト配列から587に移動するにはどうすればよいですか?

ASCIIencodingと他のいくつかのエンコーディングで読み込もうとしましたが、「K \ 0 \ 0 \ 0 \ 0\0」のようなものが表示されます。

何か案が ?ありがとう

4

3 に答える 3

5

すでに与えられた答えに加えて、実際のExif仕様を確認することをお勧めします。

GPSAltitude(47ページ)

GPSAltitudeRefの参照に基づいて高度を示します。高度は1つの有理値として表されます。基準単位はメートルです。

GPSAltitudeRef(47ページ)

基準高度として使用される高度を示します。参照が海面であり、高度が海抜より高い場合、0が与えられます。高度が海面より下にある場合、値1が指定され、高度はGPSAltitudeタグに絶対値として示されます。基準単位はメートルです。このタグは、他の参照タグとは異なり、BYTEタイプであることに注意してください。

合理的(14ページ)

2つのLONG。最初のLONGは分子で、2番目のLONGは分母を表します。

LONG(14ページ)

32ビット(4バイト)の符号なし整数。

だから、{75, 2, 0, 0, 1, 0, 0, 0}です{75, 2, 0, 0} / {1, 0, 0, 0}。バイトをリトルエンディアンのビットとして読み取ると、0000 0010 0100 1011 / 0000 0000 0000 0001587になります。他の回答は、回答を取得する方法を説明していますが、うまくいけば、これがその方法である理由を説明しています。

于 2012-06-21T13:32:14.450 に答える
1

に変換するだけbyte[]で、int期待する587の値が表示されます。

var pic = System.Drawing.Image.FromFile(@"c:\mypic.jpg");         
var GPSAltitude = pic.GetPropertyItem(6); 
var altitude = System.BitConverter.ToInt32(GPSAltitude,0);
于 2012-06-21T13:15:31.670 に答える
1

おそらくBitConverterは動作します。

public static void Main()
   {

      byte[] bytes = {75, 2, 0, 0, 1, 0, 0, 0};
      int result = BitConverter.ToInt32(bytes, 0);
      Console.WriteLine("Returned value: {0}", result);
      Console.ReadLine();
   }

結果は:587

于 2012-06-21T13:09:16.467 に答える