private static void Main(string[] args)
{
if (args.Length < 1)
{
Console.WriteLine("Less Arguments.");
return;
}
try
{
using (Bitmap bmp = new Bitmap(args[0]))
{
foreach (PropertyItem pr in bmp.PropertyItems)
{
Console.Write("ID=0x{0:X}({1}), Len={2}, Type={3}({4})",
pr.Id,
PropertyItemReader.GetExifTagId(pr.Id),
pr.Len,
pr.Type,
PropertyItemReader.GetExifType(pr.Type));
if (pr.Len > 0)
{
if (pr.Type == 2)
{
Console.WriteLine(", Value={0}",
PropertyItemReader.ReadStringValue(pr));
}
else if (pr.Type == 3 || pr.Type == 4 || pr.Type == 5 ||
pr.Type == 9 || pr.Type == 10)
{
StringBuilder sb = new StringBuilder();
foreach (object o in PropertyItemReader.ReadValues(pr))
{
sb.Append(o.ToString());
sb.Append(",");
}
sb.Remove(sb.Length - 1, 1);
Console.WriteLine(", Value={0}", sb.ToString());
}
else
{
Console.WriteLine("");
}
}
else
{
Console.WriteLine("");
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
ちなみに、実行するとこんな結果を吐き出します。
この中の「PropertyItemReader」というのは、別途作ったstaticなクラスで、PropertyItemからExif-Tagが文字列ならその値を文字列で取り出したり、数値型の配列ならArrayで取り出したり。または、Tag-IDやTag-Typeを表示名に変換したりといった機能を持ちます。(とりあえずここでは、そいつのコードは割愛します。)
で、コードをぼーっと眺めてみて、なんだかかっこ悪い。if文があまり意味もなくネストしてるし、配列をカンマ区切りの文字列にするために、StringBuilderを使っているけど、string.Joinを使えばも少しシンプルになりそう。それと、数値型の判断をしている条件文がなんだか冗長。
と、気がついたところを直してみました。こうなりました。なお、これ以降説明用に、引数チェックと例外処理は省略します。
private static void Main(string[] args)
{
using (Bitmap bmp = new Bitmap(args[0]))
{
foreach (PropertyItem pr in bmp.PropertyItems)
{
Console.Write("ID=0x{0:X}({1}), Len={2}, Type={3}({4})",
pr.Id,
PropertyItemReader.GetExifTagId(pr.Id),
pr.Len,
pr.Type,
PropertyItemReader.GetExifType(pr.Type));
if (pr.Len > 0 && pr.Type == 2)
{
Console.WriteLine(", Value={0}",
PropertyItemReader.ReadStringValue(pr));
}
else if (pr.Len > 0 && new short[] {3,4,5,9,10}.Contains(pr.Type))
{
Console.WriteLine(", Value={0}", string.Join(",",
PropertyItemReader.ReadValues(pr).Cast<object>()));
}
else
{
Console.WriteLine("");
}
}
}
}
だいぶいい感じになったかな。でも、なんだかまだちょっと不満。何でだろう。
どうやら、if ~ else if ~ elseのブロックが、それぞれがシンプルな処理なだけに、どうも気に入らない。ような気がしてきた。こいつをどうにかすることを考えよう。
が、今日はここまで。寝ないとまずいってば。続きは次のエントリで。

0 件のコメント:
コメントを投稿