0

Twitter、Instagram、および Flickr のサーバーにリモートで保存されている画像を表示するアプリケーションがあります。私が望むのは、ExifLibを使用して Exif 情報 (主に GPS データ) を抽出し、それらを画像の詳細に表示することです。

これが私がこれまでに持っているものです:

string metaData = string.Empty;
string tagValue = string.Empty;

try
{
    using (var wc = new WebClient())
    {
        byte[] imageBytes = wc.DownloadData(imgUrl);

        using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
        {
            using (ExifReader reader = new ExifReader(ms))
            {
                if (reader.GetTagValue<string>(ExifTags.GPSAltitude, out tagValue))
                    Log.Debug("GPSAltitude: " + tagValue);

                if (reader.GetTagValue<string>(ExifTags.DateTimeDigitized, out tagValue))
                    Log.Debug("DateTimeDigitized: " + tagValue);

                if (reader.GetTagValue<string>(ExifTags.DateTimeOriginal, out tagValue))
                    Log.Debug("DateTimeOriginal: " + tagValue);

                if (reader.GetTagValue<string>(ExifTags.GPSLatitude, out tagValue))
                    Log.Debug("GPSLatitude: " + tagValue);

                if (reader.GetTagValue<string>(ExifTags.GPSLongitude, out tagValue))
                    Log.Debug("GPSLongitude: " + tagValue);

            }
        }
    }
}
catch (Exception ex)
{
    Log.Exception("A problem occurred while fetching Exif data.", ex);
}

しかし、通過するすべてのimageUrlについて、画像の MemoryStream を使用してExifReaderをインスタンス化することはできません。Flickrから明らかに Exif データを含む画像を選択した場合でも、常に例外が発生し、ExifLib が Exif データを見つけることができなかったことを示します。

上記のコードで何か間違ったことをしているのですか、それとも ExifLib はリモート イメージで動作しませんか?

4

1 に答える 1

1

imageBytes実際に有効なデータが含まれているかどうかを確認してみましたか? ファイルに保存し、実際のファイルから関数を繰り返して何かが変わるかどうかを確認します。ダウンロードが成功しない可能性もありますtry..catch。.

回避策として、まずサーバー上の一時ファイルにデータを保存し、それを使用します。あなたがそれを避けたいと思っていることは知っていますが、何もしないよりは働くほうがよいでしょう。また、中間結果をサーバーに記録して、考えられる多くの欠陥 (間違った URL や Flickr が 1 分あたりのダウンロード数を超えないようにするなど) を識別してデバッグできるようにします。

于 2014-01-31T15:02:27.363 に答える