C#读取图片Exif信息
Exif是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性和拍摄数据
////调用
//string strFile="fffff.jpg";//文件名
//System.Drawing.Bitmap bmp = new Bitmap(strFile);
//EXIF.EXIFextractor er = new EXIF.EXIFextractor(ref bmp, "\n");
//Console.Write(strFile + "\r\n");
//Console.Write(er["DTDigitized"]);//拍照日期
//foreach (EXIF.Pair pr in er)
//{
//Console.Write(pr.First + ":" + pr.Second + "\r\n");
//}
EXIFextractor.cs代码:
///
/// http://www.goheer.com
/// visist goheer.com for latest version of this control
///
///
using System;
using Goheer.EXIF;
using System.Text;
using System.Collections;
using System.Drawing.Imaging;
using System.Reflection;
using System.IO;
using System.Web.UI; namespace Goheer
{
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[]; // 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, ); 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[].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 : v = "Not defined"; break;
case : v = "One-chip color area sensor"; break;
case : v = "Two-chip color area sensor"; break;
case : v = "Three-chip color area sensor"; break;
case : v = "Color sequential area sensor"; break;
case : v = "Trilinear sensor"; break;
case : v = "Color sequential linear sensor"; break;
default: v =" reserved"; break;
}
}
break;
case 0x8822: // aperture
switch( convertToInt16U(p.Value) )
{
case : v = "Not defined"; break;
case : v = "Manual"; break;
case : v = "Normal program"; break;
case : v = "Aperture priority"; break;
case : v = "Shutter priority"; break;
case : v = "Creative program (biased toward depth of field)"; break;
case : v = "Action program (biased toward fast shutter speed)"; break;
case : v = "Portrait mode (for closeup photos with the background out of focus)"; break;
case : 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 : v = "unknown";break;
case : v = "Average";break;
case : v = "CenterWeightedAverage"; break;
case : v = "Spot"; break;
case : v = "MultiSpot"; break;
case : v = "Pattern"; break;
case : v = "Partial"; break;
case : v = "Other"; break;
default: v = "reserved"; break;
}
break;
case 0x9208: // light source
{
switch(convertToInt16U(p.Value) )
{
case :v = "unknown";break;
case :v = "Daylight";break;
case :v = "Fluorescent";break;
case :v = "Tungsten";break;
case :v = "Standard light A";break;
case :v = "Standard light B";break;
case :v = "Standard light C";break;
case :v = "D55";break;
case :v = "D65";break;
case :v = "D75";break;
case :v = "other";break;
default:v = "reserved";break;
}
}
break;
case 0x9209:
{
switch(convertToInt16U(p.Value) )
{
case : v = "Flash did not fire"; break;
case : v = "Flash fired"; break;
case : v = "Strobe return light not detected"; break;
case : 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/];
byte []d = new byte[p.Len/];
Array.Copy(p.Value,,n,,p.Len/);
Array.Copy(p.Value,p.Len/,d,,p.Len/);
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(),r.ToDouble()),).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[] == )
{
v = "DSC";
}
else
{
v = "reserved";
}
break;
}
case 0xA301:
if( p.Value[] == )
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 (2's 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/];
byte []d = new byte[p.Len/];
Array.Copy(p.Value,,n,,p.Len/);
Array.Copy(p.Value,p.Len/,d,,p.Len/);
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(,r.ToDouble()),).ToString();
break;
case 0x9203:
v = Math.Round(r.ToDouble(),).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 != )
return ;
else
return arr[] << | arr[] << | arr[] << | arr[];
}
/// <summary>
///
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
int convertToInt16(byte [] arr)
{
if(arr.Length != )
return ;
else
return arr[] << | arr[];
}
/// <summary>
///
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
uint convertToInt32U(byte [] arr)
{
if(arr.Length != )
return ;
else
return Convert.ToUInt32(arr[] << | arr[] << | arr[] << | arr[]);
}
/// <summary>
///
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
uint convertToInt16U(byte [] arr)
{
if(arr.Length != )
return ;
else
return Convert.ToUInt16(arr[] << | arr[]);
}
#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 System.Web.UI.Pair(this.index.Key,this.index.Value) );
}
} public bool MoveNext()
{
if( index != null && index.MoveNext() )
return true;
else
return false;
} #endregion } }
}
translation.cs代码:
using System;
using System.Collections; namespace Goheer
{
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=;
}
public string ToString(string sp)
{
if( sp == null ) sp = "/";
return n.ToString() + sp + d.ToString();
}
public double ToDouble()
{
if( d == )
return 0.0; return Math.Round(Convert.ToDouble(n)/Convert.ToDouble(d),);
}
private void simplify( ref int a, ref int b )
{
if( a== || b == )
return; int gcd = euclid(a,b);
a /= gcd;
b /= gcd;
}
private int euclid(int a, int b)
{
if(b==)
return a;
else
return euclid(b,a%b);
}
}
}
}
C#读取图片Exif信息的更多相关文章
- Java读取图片exif信息实现图片方向自动纠正
起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...
- Android 图片Exif信息相关的获取与修改
1 Exif是什么 Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间 ...
- 利用Python读取图片exif敏感信息
众所周知,现在很多的照相机等软件,拍摄会有选项,是否包含位置信息等. 当然有的人会说,我在微信中查看图片exif信息并没有啊,这是因为你发送到微信服务器的时候,微信帮你完成了保密工作. 常见的图片中包 ...
- Android--操作图片Exif信息
前言 在Android系统中,图片文件在内存中以像素点的二维数组加载,存放像素信息,还会在开头加上一些额外的照片拍摄参数信息,这些信息就是Exif.Android2.0之后,媒体库加入了操作图片Exi ...
- Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...
- Android 获取图片exif信息
使用android api读取图片的exif信息 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...
- 图片Exif信息
Exif文件格式简述链接:https://www.zhihu.com/question/23727439/answer/25467748 可交换图像文件常被简称为Exif(Exchangeable i ...
- 改动图片exif信息
我们先了解一下EXIF: EXIF能够附加于JPEG.TIFF.RIFF等文件之中.为其添加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本号信息. 全部的JPEG文件以字符串"0xF ...
- Android中读取图片EXIF元数据之metadata-extractor的使用
一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图 ...
随机推荐
- APUE1
[APUE]进程控制(上) 一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...
- 记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的, ...
- Makeflow 4.0 发布,工作流引擎
Makeflow 4.0 发布了,主要改进包括: 1. 支持分层次的 workers,带 master-foremen-workers 范式. 2. 一个 worker 可同时处理超过 1 个的任务3 ...
- Xamarin.Android之动画
Translate动画 这个动画是最常使用到的,主要就是将控件从一个位置移动到另一个位置,并且还可以在这其中增加一定的效果,下面我们将采用两种方式实现动画,首选的是利用XML来制作动画,其次就是利用代 ...
- SQL 注入
我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...
- Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航 Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...
- C# 中 async/await 调用传统 Begin/End 异步方法
最近在改进园子的图片上传程序,希望实现用户上传图片时同时将图片文件保存在三个地方:1)服务器本地硬盘:2)又拍云:3)阿里云OSS.并且在保存时使用异步操作. 对于异步保存到本地硬盘,只需用 Stea ...
- [转]一个文件上传的jquery插件
http://www.jb51.net/article/51547.htm 这篇文章主要介绍了使用ajaxfileupload.js实现ajax上传文件php版,需要的朋友可以参考下 无论是P ...
- [OpenCV] 2、边缘检测 canny
>_<" 边缘检测代码:
- 一句话在网页右上角加一个精致下拉框:forkme on github
随着我国科技水平不断发展,玩Github的童鞋越来越多了,按照惯例,开源项目会有一个示例网站,而网站的右上角,通常会有一个forkme on github,这说明你可以去Github查看.下载项目源码 ...