获取图片EXIF信息

EXIFextractor.cs

 

EXIFextractor.cs
using  System;
using  System.Text;
using  System.Collections;
using  System.Drawing.Imaging;
using  System.Reflection;
using  System.IO; 

namespace  EXIF
{
    
///   <summary>
    
///  EXIFextractor Class
    
///  
    
///   </summary>
     public   class  EXIFextractor : IEnumerable
    {
        
///   <summary>
        
///  Get the individual property value by supplying property name
        
///  These are the valid property names :
        
///  
        
///  "Exif IFD"
        
///  "Gps IFD"
        
///  "New Subfile Type"
        
///  "Subfile Type"
        
///  "Image Width"
        
///  "Image Height"
        
///  "Bits Per Sample"
        
///  "Compression"
        
///  "Photometric Interp"
        
///  "Thresh Holding"
        
///  "Cell Width"
        
///  "Cell Height"
        
///  "Fill Order"
        
///  "Document Name"
        
///  "Image Description"
        
///  "Equip Make"
        
///  "Equip Model"
        
///  "Strip Offsets"
        
///  "Orientation"
        
///  "Samples PerPixel"
        
///  "Rows Per Strip"
        
///  "Strip Bytes Count"
        
///  "Min Sample Value"
        
///  "Max Sample Value"
        
///  "X Resolution"
        
///  "Y Resolution"
        
///  "Planar Config"
        
///  "Page Name"
        
///  "X Position"
        
///  "Y Position"
        
///  "Free Offset"
        
///  "Free Byte Counts"
        
///  "Gray Response Unit"
        
///  "Gray Response Curve"
        
///  "T4 Option"
        
///  "T6 Option"
        
///  "Resolution Unit"
        
///  "Page Number"
        
///  "Transfer Funcition"
        
///  "Software Used"
        
///  "Date Time"
        
///  "Artist"
        
///  "Host Computer"
        
///  "Predictor"
        
///  "White Point"
        
///  "Primary Chromaticities"
        
///  "ColorMap"
        
///  "Halftone Hints"
        
///  "Tile Width"
        
///  "Tile Length"
        
///  "Tile Offset"
        
///  "Tile ByteCounts"
        
///  "InkSet"
        
///  "Ink Names"
        
///  "Number Of Inks"
        
///  "Dot Range"
        
///  "Target Printer"
        
///  "Extra Samples"
        
///  "Sample Format"
        
///  "S Min Sample Value"
        
///  "S Max Sample Value"
        
///  "Transfer Range"
        
///  "JPEG Proc"
        
///  "JPEG InterFormat"
        
///  "JPEG InterLength"
        
///  "JPEG RestartInterval"
        
///  "JPEG LosslessPredictors"
        
///  "JPEG PointTransforms"
        
///  "JPEG QTables"
        
///  "JPEG DCTables"
        
///  "JPEG ACTables"
        
///  "YCbCr Coefficients"
        
///  "YCbCr Subsampling"
        
///  "YCbCr Positioning"
        
///  "REF Black White"
        
///  "ICC Profile"
        
///  "Gamma"
        
///  "ICC Profile Descriptor"
        
///  "SRGB RenderingIntent"
        
///  "Image Title"
        
///  "Copyright"
        
///  "Resolution X Unit"
        
///  "Resolution Y Unit"
        
///  "Resolution X LengthUnit"
        
///  "Resolution Y LengthUnit"
        
///  "Print Flags"
        
///  "Print Flags Version"
        
///  "Print Flags Crop"
        
///  "Print Flags Bleed Width"
        
///  "Print Flags Bleed Width Scale"
        
///  "Halftone LPI"
        
///  "Halftone LPIUnit"
        
///  "Halftone Degree"
        
///  "Halftone Shape"
        
///  "Halftone Misc"
        
///  "Halftone Screen"
        
///  "JPEG Quality"
        
///  "Grid Size"
        
///  "Thumbnail Format"
        
///  "Thumbnail Width"
        
///  "Thumbnail Height"
        
///  "Thumbnail ColorDepth"
        
///  "Thumbnail Planes"
        
///  "Thumbnail RawBytes"
        
///  "Thumbnail Size"
        
///  "Thumbnail CompressedSize"
        
///  "Color Transfer Function"
        
///  "Thumbnail Data"
        
///  "Thumbnail ImageWidth"
        
///  "Thumbnail ImageHeight"
        
///  "Thumbnail BitsPerSample"
        
///  "Thumbnail Compression"
        
///  "Thumbnail PhotometricInterp"
        
///  "Thumbnail ImageDescription"
        
///  "Thumbnail EquipMake"
        
///  "Thumbnail EquipModel"
        
///  "Thumbnail StripOffsets"
        
///  "Thumbnail Orientation"
        
///  "Thumbnail SamplesPerPixel"
        
///  "Thumbnail RowsPerStrip"
        
///  "Thumbnail StripBytesCount"
        
///  "Thumbnail ResolutionX"
        
///  "Thumbnail ResolutionY"
        
///  "Thumbnail PlanarConfig"
        
///  "Thumbnail ResolutionUnit"
        
///  "Thumbnail TransferFunction"
        
///  "Thumbnail SoftwareUsed"
        
///  "Thumbnail DateTime"
        
///  "Thumbnail Artist"
        
///  "Thumbnail WhitePoint"
        
///  "Thumbnail PrimaryChromaticities"
        
///  "Thumbnail YCbCrCoefficients"
        
///  "Thumbnail YCbCrSubsampling"
        
///  "Thumbnail YCbCrPositioning"
        
///  "Thumbnail RefBlackWhite"
        
///  "Thumbnail CopyRight"
        
///  "Luminance Table"
        
///  "Chrominance Table"
        
///  "Frame Delay"
        
///  "Loop Count"
        
///  "Pixel Unit"
        
///  "Pixel PerUnit X"
        
///  "Pixel PerUnit Y"
        
///  "Palette Histogram"
        
///  "Exposure Time"
        
///  "F-Number"
        
///  "Exposure Prog"
        
///  "Spectral Sense"
        
///  "ISO Speed"
        
///  "OECF"
        
///  "Ver"
        
///  "DTOrig"
        
///  "DTDigitized"
        
///  "CompConfig"
        
///  "CompBPP"
        
///  "Shutter Speed"
        
///  "Aperture"
        
///  "Brightness"
        
///  "Exposure Bias"
        
///  "MaxAperture"
        
///  "SubjectDist"
        
///  "Metering Mode"
        
///  "LightSource"
        
///  "Flash"
        
///  "FocalLength"
        
///  "Maker Note"
        
///  "User Comment"
        
///  "DTSubsec"
        
///  "DTOrigSS"
        
///  "DTDigSS"
        
///  "FPXVer"
        
///  "ColorSpace"
        
///  "PixXDim"
        
///  "PixYDim"
        
///  "RelatedWav"
        
///  "Interop"
        
///  "FlashEnergy"
        
///  "SpatialFR"
        
///  "FocalXRes"
        
///  "FocalYRes"
        
///  "FocalResUnit"
        
///  "Subject Loc"
        
///  "Exposure Index"
        
///  "Sensing Method"
        
///  "FileSource"
        
///  "SceneType"
        
///  "CfaPattern"
        
///  "Gps Ver"
        
///  "Gps LatitudeRef"
        
///  "Gps Latitude"
        
///  "Gps LongitudeRef"
        
///  "Gps Longitude"
        
///  "Gps AltitudeRef"
        
///  "Gps Altitude"
        
///  "Gps GpsTime"
        
///  "Gps GpsSatellites"
        
///  "Gps GpsStatus"
        
///  "Gps GpsMeasureMode"
        
///  "Gps GpsDop"
        
///  "Gps SpeedRef"
        
///  "Gps Speed"
        
///  "Gps TrackRef"
        
///  "Gps Track"
        
///  "Gps ImgDirRef"
        
///  "Gps ImgDir"
        
///  "Gps MapDatum"
        
///  "Gps DestLatRef"
        
///  "Gps DestLat"
        
///  "Gps DestLongRef"
        
///  "Gps DestLong"
        
///  "Gps DestBearRef"
        
///  "Gps DestBear"
        
///  "Gps DestDistRef"
        
///  "Gps DestDist"
        
///   </summary>
         public   object   this [ string  index]
        {
            
get
            {
                
return  properties[index];
            }
        }
        
//
         private  System.Drawing.Bitmap bmp;
        
//
         private   string  data;
        
//
         private  translation myHash;
        
//
         private  Hashtable properties;
        
//
         internal   int  Count
        {
            
get
            {
                
return   this .properties.Count;
            }
        }
        
//
         string  sp;
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="id"></param>
        
///   <param name="len"></param>
        
///   <param name="type"></param>
        
///   <param name="data"></param>
         public   void  setTag( int  id,  string  data)
        {
            Encoding ascii 
=  Encoding.ASCII;
            
this .setTag(id, data.Length,  0x2 , ascii.GetBytes(data));
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="id"></param>
        
///   <param name="len"></param>
        
///   <param name="type"></param>
        
///   <param name="data"></param>
         public   void  setTag( int  id,  int  len,  short  type,  byte [] data)
        {
            PropertyItem p 
=  CreatePropertyItem(type, id, len, data);
            
this .bmp.SetPropertyItem(p);
            buildDB(
this .bmp.PropertyItems);
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="type"></param>
        
///   <param name="tag"></param>
        
///   <param name="len"></param>
        
///   <param name="value"></param>
        
///   <returns></returns>
         private   static  PropertyItem CreatePropertyItem( short  type,  int  tag,  int  len,  byte [] value)
        {
            PropertyItem item;

            
//  Loads a PropertyItem from a Jpeg image stored in the assembly as a resource.
            Assembly assembly  =  Assembly.GetExecutingAssembly();
            Stream emptyBitmapStream 
=  assembly.GetManifestResourceStream( " EXIFextractor.decoy.jpg " );
            System.Drawing.Image empty 
=  System.Drawing.Image.FromStream(emptyBitmapStream);

            item 
=  empty.PropertyItems[ 0 ];

            
//  Copies the data to the property item.
            item.Type  =  type;
            item.Len 
=  len;
            item.Id 
=  tag;
            item.Value 
=   new   byte [value.Length];
            value.CopyTo(item.Value, 
0 );

            
return  item;
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="bmp"></param>
        
///   <param name="sp"></param>
         public  EXIFextractor( ref  System.Drawing.Bitmap bmp,  string  sp)
        {
            properties 
=   new  Hashtable();
            
//
             this .bmp  =  bmp;
            
this .sp  =  sp;
            
//
            myHash  =   new  translation();
            buildDB(
this .bmp.PropertyItems);
        }
        
string  msp  =   "" ;
        
public  EXIFextractor( ref  System.Drawing.Bitmap bmp,  string  sp,  string  msp)
        {
            properties 
=   new  Hashtable();
            
this .sp  =  sp;
            
this .msp  =  msp;
            
this .bmp  =  bmp;
            
//     
            myHash  =   new  translation();
            
this .buildDB(bmp.PropertyItems);

        }
        
public   static  PropertyItem[] GetExifProperties( string  fileName)
        {
            FileStream stream 
=   new  FileStream(fileName, FileMode.Open, FileAccess.Read);
            System.Drawing.Image image 
=  System.Drawing.Image.FromStream(stream,
                
/*  useEmbeddedColorManagement =  */   true ,
                
/*  validateImageData =  */   false );
            
return  image.PropertyItems;
        }
        
public  EXIFextractor( string  file,  string  sp,  string  msp)
        {
            properties 
=   new  Hashtable();
            
this .sp  =  sp;
            
this .msp  =  msp;

            myHash 
=   new  translation();
            
//     
             this .buildDB(GetExifProperties(file));

        }

        
///   <summary>
        
///  
        
///   </summary>
         private   void  buildDB(System.Drawing.Imaging.PropertyItem[] parr)
            {
                properties.Clear();
                
//
                data  =   "" ;
                
//
                Encoding ascii  =  Encoding.ASCII;
                
//
                 foreach  (System.Drawing.Imaging.PropertyItem p  in  parr)
                {
                    
string  v  =   "" ;
                    
string  name  =  ( string )myHash[p.Id];
                    
//  tag not found. skip it
                     if  (name  ==   null continue ;
                    
//
                    data  +=  name  +   " " ;
                    
//
                    
// 1 = BYTE An 8-bit unsigned integer.,
                     if  (p.Type  ==   0x1 )
                    {
                        v 
=  p.Value[ 0 ].ToString();
                    }
                    
// 2 = ASCII An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.,
                     else   if  (p.Type  ==   0x2 )
                    {
                        
//  string     
                        v  =  ascii.GetString(p.Value);
                    }
                    
// 3 = SHORT A 16-bit (2 -byte) unsigned integer,
                     else   if  (p.Type  ==   0x3 )
                    {
                        
//  orientation  //  lookup table     
                         switch  (p.Id)
                        {
                            
case   0x8827 //  ISO
                                v  =   " ISO- "   +  convertToInt16U(p.Value).ToString();
                                
break ;
                            
case   0xA217 //  sensing method
                                {
                                    
switch  (convertToInt16U(p.Value))
                                    {
                                        
case   1 : v  =   " Not defined " break ;
                                        
case   2 : v  =   " One-chip color area sensor " break ;
                                        
case   3 : v  =   " Two-chip color area sensor " break ;
                                        
case   4 : v  =   " Three-chip color area sensor " break ;
                                        
case   5 : v  =   " Color sequential area sensor " break ;
                                        
case   7 : v  =   " Trilinear sensor " break ;
                                        
case   8 : v  =   " Color sequential linear sensor " break ;
                                        
default : v  =   "  reserved " break ;
                                    }
                                }
                                
break ;
                            
case   0x8822 //  aperture 
                                 switch  (convertToInt16U(p.Value))
                                {
                                    
case   0 : v  =   " Not defined " break ;
                                    
case   1 : v  =   " Manual " break ;
                                    
case   2 : v  =   " Normal program " break ;
                                    
case   3 : v  =   " Aperture priority " break ;
                                    
case   4 : v  =   " Shutter priority " break ;
                                    
case   5 : v  =   " Creative program (biased toward depth of field) " break ;
                                    
case   6 : v  =   " Action program (biased toward fast shutter speed) " break ;
                                    
case   7 : v  =   " Portrait mode (for closeup photos with the background out of focus) " break ;
                                    
case   8 : v  =   " Landscape mode (for landscape photos with the background in focus) " break ;
                                    
default : v  =   " reserved " break ;
                                }
                                
break ;
                            
case   0x9207 //  metering mode
                                 switch  (convertToInt16U(p.Value))
                                {
                                    
case   0 : v  =   " unknown " break ;
                                    
case   1 : v  =   " Average " break ;
                                    
case   2 : v  =   " CenterWeightedAverage " break ;
                                    
case   3 : v  =   " Spot " break ;
                                    
case   4 : v  =   " MultiSpot " break ;
                                    
case   5 : v  =   " Pattern " break ;
                                    
case   6 : v  =   " Partial " break ;
                                    
case   255 : v  =   " Other " break ;
                                    
default : v  =   " reserved " break ;
                                }
                                
break ;
                            
case   0x9208 //  light source
                                {
                                    
switch  (convertToInt16U(p.Value))
                                    {
                                        
case   0 : v  =   " unknown " break ;
                                        
case   1 : v  =   " Daylight " break ;
                                        
case   2 : v  =   " Fluorescent " break ;
                                        
case   3 : v  =   " Tungsten " break ;
                                        
case   17 : v  =   " Standard light A " break ;
                                        
case   18 : v  =   " Standard light B " break ;
                                        
case   19 : v  =   " Standard light C " break ;
                                        
case   20 : v  =   " D55 " break ;
                                        
case   21 : v  =   " D65 " break ;
                                        
case   22 : v  =   " D75 " break ;
                                        
case   255 : v  =   " other " break ;
                                        
default : v  =   " reserved " break ;
                                    }
                                }
                                
break ;
                            
case   0x9209 :
                                {
                                    
switch  (convertToInt16U(p.Value))
                                    {
                                        
case   0 : v  =   " Flash did not fire " break ;
                                        
case   1 : v  =   " Flash fired " break ;
                                        
case   5 : v  =   " Strobe return light not detected " break ;
                                        
case   7 : v  =   " Strobe return light detected " break ;
                                        
default : v  =   " reserved " break ;
                                    }
                                }
                                
break ;
                            
default :
                                v 
=  convertToInt16U(p.Value).ToString();
                                
break ;
                        }
                    }
                    
// 4 = LONG A 32-bit (4 -byte) unsigned integer,
                     else   if  (p.Type  ==   0x4 )
                    {
                        
//  orientation  //  lookup table     
                        v  =  convertToInt32U(p.Value).ToString();
                    }
                    
// 5 = RATIONAL Two LONGs. The first LONG is the numerator and the second LONG expresses the // denominator.,
                     else   if  (p.Type  ==   0x5 )
                    {
                        
//  rational
                         byte [] n  =   new   byte [p.Len  /   2 ];
                        
byte [] d  =   new   byte [p.Len  /   2 ];
                        Array.Copy(p.Value, 
0 , n,  0 , p.Len  /   2 );
                        Array.Copy(p.Value, p.Len 
/   2 , d,  0 , p.Len  /   2 );
                        
uint  a  =  convertToInt32U(n);
                        
uint  b  =  convertToInt32U(d);
                        Rational r 
=   new  Rational(a, b);
                        
//
                        
// convert here
                        
//
                         switch  (p.Id)
                        {
                            
case   0x9202 //  aperture
                                v  =   " F/ "   +  Math.Round(Math.Pow(Math.Sqrt( 2 ), r.ToDouble()),  2 ).ToString();
                                
break ;
                            
case   0x920A :
                                v 
=  r.ToDouble().ToString();
                                
break ;
                            
case   0x829A :
                                v 
=  r.ToDouble().ToString();
                                
break ;
                            
case   0x829D //  F-number
                                v  =   " F/ "   +  r.ToDouble().ToString();
                                
break ;
                            
default :
                                v 
=  r.ToString( " / " );
                                
break ;
                        }

                    }
                    
// 7 = UNDEFINED An 8-bit byte that can take any value depending on the field definition,
                     else   if  (p.Type  ==   0x7 )
                    {
                        
switch  (p.Id)
                        {
                            
case   0xA300 :
                                {
                                    
if  (p.Value[ 0 ==   3 )
                                    {
                                        v 
=   " DSC " ;
                                    }
                                    
else
                                    {
                                        v 
=   " reserved " ;
                                    }
                                    
break ;
                                }
                            
case   0xA301 :
                                
if  (p.Value[ 0 ==   1 )
                                    v 
=   " A directly photographed image " ;
                                
else
                                    v 
=   " Not a directly photographed image " ;
                                
break ;
                            
default :
                                v 
=   " - " ;
                                
break ;
                        }
                    }
                    
// 9 = SLONG A 32-bit (4 -byte) signed integer (2s complement notation),
                     else   if  (p.Type  ==   0x9 )
                    {
                        v 
=  convertToInt32(p.Value).ToString();
                    }
                    
// 10 = SRATIONAL Two SLONGs. The first SLONG is the numerator and the second SLONG is the
                    
// denominator.
                     else   if  (p.Type  ==   0xA )
                    {

                        
//  rational
                         byte [] n  =   new   byte [p.Len  /   2 ];
                        
byte [] d  =   new   byte [p.Len  /   2 ];
                        Array.Copy(p.Value, 
0 , n,  0 , p.Len  /   2 );
                        Array.Copy(p.Value, p.Len 
/   2 , d,  0 , p.Len  /   2 );
                        
int  a  =  convertToInt32(n);
                        
int  b  =  convertToInt32(d);
                        Rational r 
=   new  Rational(a, b);
                        
//
                        
//  convert here
                        
//
                         switch  (p.Id)
                        {
                            
case   0x9201 //  shutter speed
                                v  =   " 1/ "   +  Math.Round(Math.Pow( 2 , r.ToDouble()),  2 ).ToString();
                                
break ;
                            
case   0x9203 :
                                v 
=  Math.Round(r.ToDouble(),  4 ).ToString();
                                
break ;
                            
default :
                                v 
=  r.ToString( " / " );
                                
break ;
                        }
                    }
                    
//  add it to the list
                     if  (properties[name]  ==   null )
                        properties.Add(name, v);
                    
//  cat it too
                    data  +=  v;
                    data 
+=   this .sp;
                }

            }

        
///   <summary>
        
///  
        
///   </summary>
        
///   <returns></returns>
         public   override   string  ToString()
        {
            
return  data;
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="arr"></param>
        
///   <returns></returns>
         int  convertToInt32( byte [] arr)
        {
            
if  (arr.Length  !=   4 )
                
return   0 ;
            
else
                
return  arr[ 3 <<   24   |  arr[ 2 <<   16   |  arr[ 1 <<   8   |  arr[ 0 ];
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="arr"></param>
        
///   <returns></returns>
         int  convertToInt16( byte [] arr)
        {
            
if  (arr.Length  !=   2 )
                
return   0 ;
            
else
                
return  arr[ 1 <<   8   |  arr[ 0 ];
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="arr"></param>
        
///   <returns></returns>
         uint  convertToInt32U( byte [] arr)
        {
            
if  (arr.Length  !=   4 )
                
return   0 ;
            
else
                
return  Convert.ToUInt32(arr[ 3 <<   24   |  arr[ 2 <<   16   |  arr[ 1 <<   8   |  arr[ 0 ]);
        }
        
///   <summary>
        
///  
        
///   </summary>
        
///   <param name="arr"></param>
        
///   <returns></returns>
         uint  convertToInt16U( byte [] arr)
        {
            
if  (arr.Length  !=   2 )
                
return   0 ;
            
else
                
return  Convert.ToUInt16(arr[ 1 <<   8   |  arr[ 0 ]);
        }
        
#region  IEnumerable Members

        
public  IEnumerator GetEnumerator()
        {
            
//  TODO:  Add EXIFextractor.GetEnumerator implementation
             return  ( new  EXIFextractorEnumerator( this .properties));
        }

        
#endregion
    }

    
//
    
//  dont touch this class. its for IEnumerator
    
//  
    
//
     class  EXIFextractorEnumerator : IEnumerator
    {
        Hashtable exifTable;
        IDictionaryEnumerator index;

        
internal  EXIFextractorEnumerator(Hashtable exif)
        {
            
this .exifTable  =  exif;
            
this .Reset();
            index 
=  exif.GetEnumerator();
        }

        
#region  IEnumerator Members

        
public   void  Reset()
        {
            
this .index  =   null ;
        }

        
public   object  Current
        {
            
get
            {
                
return  ( new  Pair( this .index.Key,  this .index.Value));
            }
        }

        
public   bool  MoveNext()
        {
            
if  (index  !=   null   &&  index.MoveNext())
                
return   true ;
            
else
                
return   false ;
        }

        
#endregion

    }
    
public   class  Pair
    {
        
public   string  First;
        
public   string  Second;
        
public  Pair( object  key,  object  value)
        {
            
this .First  =  key.ToString();
            
this .Second  =  value.ToString();
        }
    }

}

 

translation.cs

 

translation.cs
using  System;
using  System.Collections.Generic;
using  System.Collections;
using  System.Text;

namespace  EXIF
{
    
///   <summary>
    
///  summary description for translation.
    
///   </summary>
     public   class  translation : Hashtable 
    {
        
///   <summary>
        
///  
        
///   </summary>
         public  translation()
        {
            
this .Add( 0x8769 " exif ifd " );
            
this .Add( 0x8825 " gps ifd " );
            
this .Add( 0xfe " new subfile type " );
            
this .Add( 0xff " subfile type " );
            
this .Add( 0x100 " image width " );
            
this .Add( 0x101 " image height " );
            
this .Add( 0x102 " bits per sample " );
            
this .Add( 0x103 " compression " );
            
this .Add( 0x106 " photometric interp " );
            
this .Add( 0x107 " thresh holding " );
            
this .Add( 0x108 " cell width " );
            
this .Add( 0x109 " cell height " );
            
this .Add( 0x10a " fill order " );
            
this .Add( 0x10d " document name " );
            
this .Add( 0x10e " image description " );
            
this .Add( 0x10f " equip make " );
            
this .Add( 0x110 " equip model " );
            
this .Add( 0x111 " strip offsets " );
            
this .Add( 0x112 " orientation " );
            
this .Add( 0x115 " samples perpixel " );
            
this .Add( 0x116 " rows per strip " );
            
this .Add( 0x117 " strip bytes count " );
            
this .Add( 0x118 " min sample value " );
            
this .Add( 0x119 " max sample value " );
            
this .Add( 0x11a " x resolution " );
            
this .Add( 0x11b " y resolution " );
            
this .Add( 0x11c " planar config " );
            
this .Add( 0x11d " page name " );
            
this .Add( 0x11e " x position " );
            
this .Add( 0x11f " y position " );
            
this .Add( 0x120 " free offset " );
            
this .Add( 0x121 " free byte counts " );
            
this .Add( 0x122 " gray response unit " );
            
this .Add( 0x123 " gray response curve " );
            
this .Add( 0x124 " t4 option " );
            
this .Add( 0x125 " t6 option " );
            
this .Add( 0x128 " resolution unit " );
            
this .Add( 0x129 " page number " );
            
this .Add( 0x12d " transfer funcition " );
            
this .Add( 0x131 " software used " );
            
this .Add( 0x132 " date time " );
            
this .Add( 0x13b " artist " );
            
this .Add( 0x13c " host computer " );
            
this .Add( 0x13d " predictor " );
            
this .Add( 0x13e " white point " );
            
this .Add( 0x13f " primary chromaticities " );
            
this .Add( 0x140 " colormap " );
            
this .Add( 0x141 " halftone hints " );
            
this .Add( 0x142 " tile width " );
            
this .Add( 0x143 " tile length " );
            
this .Add( 0x144 " tile offset " );
            
this .Add( 0x145 " tile bytecounts " );
            
this .Add( 0x14c " inkset " );
            
this .Add( 0x14d " ink names " );
            
this .Add( 0x14e " number of inks " );
            
this .Add( 0x150 " dot range " );
            
this .Add( 0x151 " target printer " );
            
this .Add( 0x152 " extra samples " );
            
this .Add( 0x153 " sample format " );
            
this .Add( 0x154 " s min sample value " );
            
this .Add( 0x155 " s max sample value " );
            
this .Add( 0x156 " transfer range " );
            
this .Add( 0x200 " jpeg proc " );
            
this .Add( 0x201 " jpeg interformat " );
            
this .Add( 0x202 " jpeg interlength " );
            
this .Add( 0x203 " jpeg restartinterval " );
            
this .Add( 0x205 " jpeg losslesspredictors " );
            
this .Add( 0x206 " jpeg pointtransforms " );
            
this .Add( 0x207 " jpeg qtables " );
            
this .Add( 0x208 " jpeg dctables " );
            
this .Add( 0x209 " jpeg actables " );
            
this .Add( 0x211 " ycbcr coefficients " );
            
this .Add( 0x212 " ycbcr subsampling " );
            
this .Add( 0x213 " ycbcr positioning " );
            
this .Add( 0x214 " ref black white " );
            
this .Add( 0x8773 " icc profile " );
            
this .Add( 0x301 " gamma " );
            
this .Add( 0x302 " icc profile descriptor " );
            
this .Add( 0x303 " srgb renderingintent " );
            
this .Add( 0x320 " image title " );
            
this .Add( 0x8298 " copyright " );
            
this .Add( 0x5001 " resolution x unit " );
            
this .Add( 0x5002 " resolution y unit " );
            
this .Add( 0x5003 " resolution x lengthunit " );
            
this .Add( 0x5004 " resolution y lengthunit " );
            
this .Add( 0x5005 " print flags " );
            
this .Add( 0x5006 " print flags version " );
            
this .Add( 0x5007 " print flags crop " );
            
this .Add( 0x5008 " print flags bleed width " );
            
this .Add( 0x5009 " print flags bleed width scale " );
            
this .Add( 0x500a " halftone lpi " );
            
this .Add( 0x500b " halftone lpiunit " );
            
this .Add( 0x500c " halftone degree " );
            
this .Add( 0x500d " halftone shape " );
            
this .Add( 0x500e " halftone misc " );
            
this .Add( 0x500f " halftone screen " );
            
this .Add( 0x5010 " jpeg quality " );
            
this .Add( 0x5011 " grid size " );
            
this .Add( 0x5012 " thumbnail format " );
            
this .Add( 0x5013 " thumbnail width " );
            
this .Add( 0x5014 " thumbnail height " );
            
this .Add( 0x5015 " thumbnail colordepth " );
            
this .Add( 0x5016 " thumbnail planes " );
            
this .Add( 0x5017 " thumbnail rawbytes " );
            
this .Add( 0x5018 " thumbnail size " );
            
this .Add( 0x5019 " thumbnail compressedsize " );
            
this .Add( 0x501a " color transfer function " );
            
this .Add( 0x501b " thumbnail data " );
            
this .Add( 0x5020 " thumbnail imagewidth " );
            
this .Add( 0x502 " thumbnail imageheight " );
            
this .Add( 0x5022 " thumbnail bitspersample " );
            
this .Add( 0x5023 " thumbnail compression " );
            
this .Add( 0x5024 " thumbnail photometricinterp " );
            
this .Add( 0x5025 " thumbnail imagedescription " );
            
this .Add( 0x5026 " thumbnail equipmake " );
            
this .Add( 0x5027 " thumbnail equipmodel " );
            
this .Add( 0x5028 " thumbnail stripoffsets " );
            
this .Add( 0x5029 " thumbnail orientation " );
            
this .Add( 0x502a " thumbnail samplesperpixel " );
            
this .Add( 0x502b " thumbnail rowsperstrip " );
            
this .Add( 0x502c " thumbnail stripbytescount " );
            
this .Add( 0x502d " thumbnail resolutionx " );
            
this .Add( 0x502e " thumbnail resolutiony " );
            
this .Add( 0x502f " thumbnail planarconfig " );
            
this .Add( 0x5030 " thumbnail resolutionunit " );
            
this .Add( 0x5031 " thumbnail transferfunction " );
            
this .Add( 0x5032 " thumbnail softwareused " );
            
this .Add( 0x5033 " thumbnail datetime " );
            
this .Add( 0x5034 " thumbnail artist " );
            
this .Add( 0x5035 " thumbnail whitepoint " );
            
this .Add( 0x5036 " thumbnail primarychromaticities " );
            
this .Add( 0x5037 " thumbnail ycbcrcoefficients " );
            
this .Add( 0x5038 " thumbnail ycbcrsubsampling " );
            
this .Add( 0x5039 " thumbnail ycbcrpositioning " );
            
this .Add( 0x503a " thumbnail refblackwhite " );
            
this .Add( 0x503b " thumbnail copyright " );
            
this .Add( 0x5090 " luminance table " );
            
this .Add( 0x5091 " chrominance table " );
            
this .Add( 0x5100 " frame delay " );
            
this .Add( 0x5101 " loop count " );
            
this .Add( 0x5110 " pixel unit " );
            
this .Add( 0x5111 " pixel perunit x " );
            
this .Add( 0x5112 " pixel perunit y " );
            
this .Add( 0x5113 " palette histogram " );
            
this .Add( 0x829a " exposure time " );
            
this .Add( 0x829d " f-number " );
            
this .Add( 0x8822 " exposure prog " );
            
this .Add( 0x8824 " spectral sense " );
            
this .Add( 0x8827 " iso speed " );
            
this .Add( 0x8828 " oecf " );
            
this .Add( 0x9000 " ver " );
            
this .Add( 0x9003 " dtorig " );
            
this .Add( 0x9004 " dtdigitized " );
            
this .Add( 0x9101 " compconfig " );
            
this .Add( 0x9102 " compbpp " );
            
this .Add( 0x9201 " shutter speed " );
            
this .Add( 0x9202 " aperture " );
            
this .Add( 0x9203 " brightness " );
            
this .Add( 0x9204 " exposure bias " );
            
this .Add( 0x9205 " maxaperture " );
            
this .Add( 0x9206 " subjectdist " );
            
this .Add( 0x9207 " metering mode " );
            
this .Add( 0x9208 " lightsource " );
            
this .Add( 0x9209 " flash " );
            
this .Add( 0x920a " focallength " );
            
this .Add( 0x927c " maker note " );
            
this .Add( 0x9286 " user comment " );
            
this .Add( 0x9290 " dtsubsec " );
            
this .Add( 0x9291 " dtorigss " );
            
this .Add( 0x9292 " dtdigss " );
            
this .Add( 0xa000 " fpxver " );
            
this .Add( 0xa001 " colorspace " );
            
this .Add( 0xa002 " pixxdim " );
            
this .Add( 0xa003 " pixydim " );
            
this .Add( 0xa004 " relatedwav " );
            
this .Add( 0xa005 " interop " );
            
this .Add( 0xa20b " flashenergy " );
            
this .Add( 0xa20c " spatialfr " );
            
this .Add( 0xa20e " focalxres " );
            
this .Add( 0xa20f " focalyres " );
            
this .Add( 0xa210 " focalresunit " );
            
this .Add( 0xa214 " subject loc " );
            
this .Add( 0xa215 " exposure index " );
            
this .Add( 0xa217 " sensing method " );
            
this .Add( 0xa300 " filesource " );
            
this .Add( 0xa301 " scenetype " );
            
this .Add( 0xa302 " cfapattern " );
            
this .Add( 0x0 " gps ver " );
            
this .Add( 0x1 " gps latituderef " );
            
this .Add( 0x2 " gps latitude " );
            
this .Add( 0x3 " gps longituderef " );
            
this .Add( 0x4 " gps longitude " );
            
this .Add( 0x5 " gps altituderef " );
            
this .Add( 0x6 " gps altitude " );
            
this .Add( 0x7 " gps gpstime " );
            
this .Add( 0x8 " gps gpssatellites " );
            
this .Add( 0x9 " gps gpsstatus " );
            
this .Add( 0xa " gps gpsmeasuremode " );
            
this .Add( 0xb " gps gpsdop " );
            
this .Add( 0xc " gps speedref " );
            
this .Add( 0xd " gps speed " );
            
this .Add( 0xe " gps trackref " );
            
this .Add( 0xf " gps track " );
            
this .Add( 0x10 " gps imgdirref " );
            
this .Add( 0x11 " gps imgdir " );
            
this .Add( 0x12 " gps mapdatum " );
            
this .Add( 0x13 " gps destlatref " );
            
this .Add( 0x14 " gps destlat " );
            
this .Add( 0x15 " gps destlongref " );
            
this .Add( 0x16 " gps destlong " );
            
this .Add( 0x17 " gps destbearref " );
            
this .Add( 0x18 " gps destbear " );
            
this .Add( 0x19 " gps destdistref " );
            
this .Add( 0x1a " gps destdist " );
        }
    }
    
///   <summary>
    
///  private class
    
///   </summary>
     internal   class  Rational
    {
        
private   int  n;
        
private   int  d;
        
public  Rational( int  n,  int  d)
        {
            
this .n  =  n;
            
this .d  =  d;
            simplify(
ref   this .n,  ref   this .d);
        }
        
public  Rational( uint  n,  uint  d)
        {
            
this .n  =  Convert.ToInt32(n);
            
this .d  =  Convert.ToInt32(d);

            simplify(
ref   this .n,  ref   this .d);
        }
        
public  Rational()
        {
            
this .n  =   this .d  =   0 ;
        }
        
public   string  ToString( string  sp)
        {
            
if  (sp  ==   null ) sp  =   " / " ;
            
return  n.ToString()  +  sp  +  d.ToString();
        }
        
public   double  ToDouble()
        {
            
if  (d  ==   0 )
                
return   0.0 ;

            
return  Math.Round(Convert.ToDouble(n)  /  Convert.ToDouble(d),  2 );
        }
        
private   void  simplify( ref   int  a,  ref   int  b)
        {
            
if  (a  ==   0   ||  b  ==   0 )
                
return ;

            
int  gcd  =  euclid(a, b);
            a 
/=  gcd;
            b 
/=  gcd;
        }
        
private   int  euclid( int  a,  int  b)
        {
            
if  (b  ==   0 )
                
return  a;
            
else
                
return  euclid(b, a  %  b);
        }
    }
}

 

Program.cs

 

Program.cs
static   void  Main( string [] args)
{
    
string  strFile  =   " DSC_0170.JPG " ;
    System.Drawing.Bitmap bmp 
=   new  Bitmap(strFile);

    
//  create a new instance of Extractor 
    
//  class. Here "\n" is the newline 
    
//  that is used to seprate output of two tags. 
    
//  You can replace it with "," if you want
    EXIF.EXIFextractor er  =   new  EXIF.EXIFextractor( ref  bmp,  " \n " );

    
//  now dump all the tags on console
    Console.Write(er);

    
//  to set a tag you have to specify the tag id
    
//  code 0x13B is for artist name
    
//  since this number has ascii string with 
    
//  it pass the string you want to set
    
// er.setTag(0x13B, " http://www.goheer.com ");

    
//  dispose the image here or do whatever you want.
    bmp.Dispose();
    
    Console.ReadLine();
}

 

 整理自: http://www.codeproject.com/KB/graphics/exifextractor.aspx

你可能感兴趣的:(Exif)