我知道WPF允许您使用需要WIC编解码器查看的图像(为了参数,比如数码相机RAW文件);但是我只能看到它可以让你本地显示图像,但我无法看到获取元数据(例如,曝光时间)。
显然可以这样做,因为Windows资源管理器显示它,但这是通过.net API公开的,或者你认为它只是调用本机COM接口
答案 0 :(得分:9)
查看我的Intuipic项目。特别是BitmapOrientationConverter类,它读取元数据以确定图像的方向:
using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
BitmapFrame bitmapFrame = BitmapFrame.Create(fileStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
BitmapMetadata bitmapMetadata = bitmapFrame.Metadata as BitmapMetadata;
if ((bitmapMetadata != null) && (bitmapMetadata.ContainsQuery(_orientationQuery)))
{
object o = bitmapMetadata.GetQuery(_orientationQuery);
if (o != null)
{
//refer to http://www.impulseadventure.com/photo/exif-orientation.html for details on orientation values
switch ((ushort) o)
{
case 6:
return 90D;
case 3:
return 180D;
case 8:
return 270D;
}
}
}
}
答案 1 :(得分:2)
虽然WPF确实提供了这些API,但它们并不是非常友好,而且它们并不是特别快。我怀疑他们正在做很多互操作。
我维护simple open-source library,用于从图片和视频中提取元数据。它是100%C#,没有P / Invoke。
// Read all metadata from the image
var directories = ImageMetadataReader.ReadMetadata(stream);
// Find the so-called Exif "SubIFD" (which may be null)
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
// Read the orientation
var orientation = subIfdDirectory?.GetInt(ExifDirectoryBase.TagOrientation);
switch (orientation)
{
case 6:
return 90D;
case 3:
return 180D;
case 8:
return 270D;
}
在我的基准测试中,这比WPF API快17倍。如果您只想从JPEG中使用Exif,请使用以下内容,速度提高30倍以上:
var directories = JpegMetadataReader.ReadMetadata(stream, new[] { new ExifReader() });
元数据提取器库可通过NuGet和code's on GitHub获得。
归功于自2002年开始以来帮助该项目的众多贡献者。