我有一个应用程序,可以显示远程存储在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 ;它总是命中Exception并指示ExifLib无法找到Exif数据,即使我选择显然有Exif数据的an image from Flickr。
我在上面的代码中做错了什么,或者ExifLib不能用于远程图像?
答案 0 :(得分:1)
您是否尝试过检查imageBytes
是否确实包含有效数据?
将其保存到文件中,看看是否从实际文件中重复您的函数会改变任何内容。
也许下载甚至没有成功,你在try..catch
中有很多活动。
作为解决方法,首先将数据保存在服务器上的临时文件中并使用它。我知道你想要避免这种情况,但工作比没有好。并将中间结果记录在服务器上,以便区分和调试许多可能的缺陷(例如错误的URL或Flickr,不希望每分钟超过一定的下载量)。