用vc6.0如何读取图片的详细信息(exif信息),如照相机型号,拍摄时间等!我初学,希望说的详细些,谢谢了!外加如何读取avi格式视频文件的播放总时间(在只知道绝对路径的情况下(wmp控件必须播放才能知道总时间))!

解决方案 »

  1.   

    读取详细信息应该知道文件的格式,这些信息都包括在文件的格式里面的我写过一个读取AVI视频有多少帧的一个程序微软提供有专门的函数
      

  2.   

    看看这个文档吧
    http://www.codeproject.com/KB/graphics/cexif.aspx
      

  3.   

    用函数OleLoadPicture从包含有图像数据的流中装载图像帮你找了些资料:这个类中构造了两个结构MetadataDetail 和 Metadata ,前者是为了存储EXIF中某元素信息的三种格式,起到中间转化的作用,一个是十六进制的索引信息,一个是没用处理过的信息代码,一个是显示信息。后面的那个结构就是存储一张图片所有EXIF信息元素的。 有两个方法LookupEXIFValue 和 GetEXIFMetaData ,前一个方法是处理特殊元素的对应显示的,后者从图片中读取相关信息然后填充到MetaData结构中。 
    using System; 
    using System.Drawing; 
    using System.Drawing.Imaging; 
    using System.Collections; 
    using System.ComponentModel; 
    namespace Test.Com 

    ///  
    /// 功能:获得图片EXIF信息 
    /// 作者:Rexsp 
    /// 创建日期:2004-03-20 
    ///  
    public class EXIFMetaData 

    #region 构造函数 
    ///  
    /// 构造函数 
    ///  
    public EXIFMetaData() 


    #endregion 
    #region 数据转换结构 
    ///  
    /// 转换数据结构 
    ///  
    public struct MetadataDetail 

    public string Hex;//十六进制字符串 
    public string RawValueAsString;//原始值串 
    public string DisplayValue;//显示值串 

    #endregion 
    #region EXIF元素结构 
    ///  
    /// 结构:存储EXIF元素信息 
    ///  
    public struct Metadata 

    public MetadataDetail EquipmentMake; 
    public MetadataDetail CameraModel; 
    public MetadataDetail ExposureTime;//曝光时间 
    public MetadataDetail Fstop; 
    public MetadataDetail DatePictureTaken; 
    public MetadataDetail ShutterSpeed;// 快门速度 
    public MetadataDetail MeteringMode;//曝光模式 
    public MetadataDetail Flash;//闪光灯 
    public MetadataDetail XResolution; 
    public MetadataDetail YResolution; 
    public MetadataDetail ImageWidth;//照片宽度 
    public MetadataDetail ImageHeight;//照片高度 
    public MetadataDetail FNumber;// f值,光圈数 
    public MetadataDetail ExposureProg;// 曝光程序 
    public MetadataDetail SpectralSense;// 
    public MetadataDetail ISOSpeed;// ISO感光度 
    public MetadataDetail OECF;// 
    public MetadataDetail Ver;// EXIF版本 
    public MetadataDetail CompConfig;// 色彩设置 
    public MetadataDetail CompBPP;// 压缩比率 
    public MetadataDetail Aperture;// 光圈值 
    public MetadataDetail Brightness;// 亮度值Ev 
    public MetadataDetail ExposureBias;// 曝光补偿 
    public MetadataDetail MaxAperture;// 最大光圈值 
    public MetadataDetail SubjectDist;// 主体距离 
    public MetadataDetail LightSource;// 白平衡 
    public MetadataDetail FocalLength;// 焦距 
    public MetadataDetail FPXVer;// FlashPix版本 
    public MetadataDetail ColorSpace;// 色彩空间 
    public MetadataDetail Interop;// 
    public MetadataDetail FlashEnergy;// 
    public MetadataDetail SpatialFR;// 
    public MetadataDetail FocalXRes;// 
    public MetadataDetail FocalYRes;// 
    public MetadataDetail FocalResUnit;// 
    public MetadataDetail ExposureIndex;// 曝光指数 
    public MetadataDetail SensingMethod;// 感应方式 
    public MetadataDetail SceneType;// 
    public MetadataDetail CfaPattern;// 

    #endregion 
    #region 查找EXIF元素值 
    public string LookupEXIFValue(string Description, string Value) 

    string DescriptionValue = null; 
    switch(Description) 

    case "MeteringMode": 
    #region MeteringMode 

    switch(Value) 

    case "0": 
    DescriptionValue = "Unknown";break; 
    case "1": 
    DescriptionValue = "Average";break; 
    case "2": 
    DescriptionValue = "Center Weighted Average";break; 
    case "3": 
    DescriptionValue = "Spot";break; 
    case "4": 
    DescriptionValue = "Multi-spot";break; 
    case "5": 
    DescriptionValue = "Multi-segment";break; 
    case "6": 
    DescriptionValue = "Partial";break; 
    case "255": 
    DescriptionValue = "Other";break; 


    #endregion 
    break; 
    case "ResolutionUnit": 
    #region ResolutionUnit 

    switch(Value) 

    case "1": 
    DescriptionValue = "No Units";break; 
    case "2": 
    DescriptionValue = "Inch";break; 
    case "3": 
    DescriptionValue = "Centimeter";break; 


    #endregion 
    break; 
    //省略N行相似代码 

    return DescriptionValue; 

    #endregion 
    #region 取得图片的EXIF信息 
    public Metadata GetEXIFMetaData(string PhotoName) 

    // 创建一个图片的实例 
    System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName); 
    // 创建一个整型数组来存储图像中属性数组的ID 
    int[] MyPropertyIdList = MyImage.PropertyIdList; 
    //创建一个封闭图像属性数组的实例 
    PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length]; 
    //创建一个图像EXIT信息的实例结构对象,并且赋初值 
    #region 创建一个图像EXIT信息的实例结构对象,并且赋初值 
    Metadata MyMetadata = new Metadata(); 
    MyMetadata.EquipmentMake.Hex = "10f"; 
    MyMetadata.CameraModel.Hex = "110"; 
    MyMetadata.DatePictureTaken.Hex = "9003"; 
    MyMetadata.ExposureTime.Hex = "829a"; 
    MyMetadata.Fstop.Hex = "829d"; 
    MyMetadata.ShutterSpeed.Hex = "9201"; 
    MyMetadata.MeteringMode.Hex = "9207"; 
    MyMetadata.Flash.Hex = "9209"; 
    MyMetadata.FNumber.Hex = "829d"; // 
    MyMetadata.ExposureProg.Hex = ""; // 
    MyMetadata.SpectralSense.Hex = "8824"; // 
    MyMetadata.ISOSpeed.Hex = "8827"; // 
    MyMetadata.OECF.Hex = "8828"; // 
    MyMetadata.Ver.Hex = "9000"; // 
    MyMetadata.CompConfig.Hex = "9101"; // 
    MyMetadata.CompBPP.Hex = "9102"; // 
    MyMetadata.Aperture.Hex = "9202"; // 
    MyMetadata.Brightness.Hex = "9203"; // 
    MyMetadata.ExposureBias.Hex = "9204"; // 
    MyMetadata.MaxAperture.Hex = "9205"; // 
    MyMetadata.SubjectDist.Hex = "9206"; // 
    MyMetadata.LightSource.Hex = "9208"; // 
    MyMetadata.FocalLength.Hex = "920a"; // 
    MyMetadata.FPXVer.Hex = "a000"; // 
    MyMetadata.ColorSpace.Hex = "a001"; // 
    MyMetadata.FocalXRes.Hex = "a20e"; // 
    MyMetadata.FocalYRes.Hex = "a20f"; // 
    MyMetadata.FocalResUnit.Hex = "a210"; // 
    MyMetadata.ExposureIndex.Hex = "a215"; // 
    MyMetadata.SensingMethod.Hex = "a217"; // 
    MyMetadata.SceneType.Hex = "a301"; 
    MyMetadata.CfaPattern.Hex = "a302"; 
    #endregion 
    // ASCII编码 
    System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding(); 
    int index = 0; 
    int MyPropertyIdListCount=MyPropertyIdList.Length; 
    if(MyPropertyIdListCount!=0) 

    foreach (int MyPropertyId in MyPropertyIdList) 

    string hexVal = ""; 
    MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId); 
    #region 初始化各属性值 
    string myPropertyIdString=MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x"); 
    switch(myPropertyIdString) 

    case "10f": 

    MyMetadata.EquipmentMake.RawValueAsString =BitConverter.ToString(MyImage.GetPropertyItem (MyPropertyId).Value); 
    MyMetadata.EquipmentMake.DisplayValue = Value.GetString(MyPropertyItemList[index].Value); 
    break; 

    case "110": 

    MyMetadata.CameraModel.RawValueAsString =BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value); 
    MyMetadata.CameraModel.DisplayValue =Value.GetString(MyPropertyItemList[index].Value); 
    break; 

    case "9003": 

    MyMetadata.DatePictureTaken.RawValueAsString =BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value); 
    MyMetadata.DatePictureTaken.DisplayValue =Value.GetString(MyPropertyItemList[index].Value); 
    break; 

    //省略N行相似代码 

    #endregion 
    index++; 


    MyMetadata.XResolution.DisplayValue = MyImage.HorizontalResolution.ToString(); 
    MyMetadata.YResolution.DisplayValue = MyImage.VerticalResolution.ToString(); 
    MyMetadata.ImageHeight.DisplayValue = MyImage.Height.ToString(); 
    MyMetadata.ImageWidth.DisplayValue = MyImage.Width.ToString(); 
    MyImage.Dispose(); 
    return MyMetadata; 

    #endregion 


    然后就是个调用的问题,有了这个类,我如何读取图片的EXIF信息呢?代码如下: 
    EXIFMetaData em = new EXIFMetaData(); 
    string filePath=Server.MapPath("Test.jpg");//这里可以动态传递图片路径的 
    EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);//这里就是调用,传图片绝对路径 
    string exif = m.Ver.DisplayValue; 
    string camera = m.CameraModel.DisplayValue; 
    string model = m.CameraModel.DisplayValue; 
    string aperture = m.Aperture.DisplayValue; 
    string shutter = m.ShutterSpeed.DisplayValue; 
    string sensitive = m.ExposureIndex.DisplayValue; 
    此代码经过测试,功能正常。
      

  4.   

    http://www.codeproject.com/KB/graphics/cexif.aspx
      

  5.   

    先谢谢大家了,avi那个已经搞定了!
    3楼写的那个我在网上也找到了,可是
    using System; 
    using System.Drawing; 
    using System.Drawing.Imaging; 
    using System.Collections; 
    using System.ComponentModel; 
    这段程序在VC6.0下,如何编译?为什么我总是报错,编译器说system不是关键字。例子我也看了,不过没看太明白,我所需要的也没提取出来!我的图片是用GDI+载入显示的,不知道用GDI+能不能得到图片的详细信息呢?
      

  6.   

    我前段时间写了一个这样的DLL.可代码不知道让我放哪了。也很简单。就按顺序一个一个读的。偏移一下。一会就得到了。