posts - 241,  comments - 116,  trackbacks - 0
          老爸老媽去歐洲畫了一個圈,帶回來一千多張照片(數量沒法和年輕人比)。

          雖然老爸曉得調節(jié)相機中的時間,但是畢竟年歲不饒人,整差了12個小時。

          也就是下午4點拍的照片,Exif里顯示是凌晨4點。

          好在歐洲大陸都用相同的時區(qū)(偶沒去過,不曉得,只是老爸說導游都是這樣執(zhí)行的),每張都 +12H 即可。

          基本各種照片查看工具都有批量修改功能,但無奈咱需要“時間+12H”確誰也沒有。

          咋辦?自己寫段代碼吧。

          由于用途單一,且是一錘子買賣,就沒有“修飾”各種選項、配置,有需要的童鞋可以進一步完善。

          (代碼是在以前寫的一個查看Exif小程序的基礎上寫的,提供整個工程下載)
                      DialogUtil openFolder = new DialogUtil();
                      if (openFolder.ShowFolderDialog() == DialogResult.OK)
                      {
                          DirectoryInfo source = new DirectoryInfo(openFolder.Path);
                          foreach (FileInfo fi in source.GetFiles("*.jpg"))
                          {
                              ExifManager exif = new ExifManager(fi.FullName);
                              exif.DateTimeOriginal = exif.DateTimeOriginal.AddHours(12);
                              exif.DateTimeDigitized = exif.DateTimeDigitized.AddHours(12);
                              exif.Save(fi.DirectoryName + "\\new\\" + fi.Name);
                              exif.Dispose();
                          }
                      }
          using System;
          using System.Collections.Generic;
          using System.Text;

          namespace ExifShow
          {
          //
          // Utility class for working with EXIF data in images. Provides abstraction
          // for most common data and generic utilities for work with all other.
          //
          //
          // Copyright (c) Michal A. Valášek - Altair Communications, 2003-2005
          // Copmany: http://software.altaircom.net, E-mail: support@altaircom.net
          // Private: http://www.rider.cz, E-mail: rider@rider.cz
          // This is free software licensed under GNU Lesser General Public License
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 12.06.2004 Added capability to write EXIF data
          // [altair] 11.07.2004 Added option to change encoding
          // [altair] 04.09.2005 Changed source of Width and Height properties from EXIF to image
          // [altair] 05.09.2005 Code clean-up and minor changes
          // [marco.ridoni@virgilio.it] 02-11-2006 C# translation
          //
          public class ExifManager : IDisposable
          {

          private System.Drawing.Bitmap _Image;
          private System.Text.Encoding _Encoding = System.Text.Encoding.UTF8;

          #region Type declarations

          //
          // Contains possible values of EXIF tag names (ID)
          //
          // See GdiPlusImaging.h
          //
          // [altair] 10.09.2003 Created
          //

          public enum TagNames : int
          {
          ExifIFD = 0x8769,
          GpsIFD = 0x8825,
          NewSubfileType = 0xFE,
          SubfileType = 0xFF,
          ImageWidth = 0x100,
          ImageHeight = 0x101,
          BitsPerSample = 0x102,
          Compression = 0x103,
          PhotometricInterp = 0x106,
          ThreshHolding = 0x107,
          CellWidth = 0x108,
          CellHeight = 0x109,
          FillOrder = 0x10A,
          DocumentName = 0x10D,
          ImageDescription = 0x10E,
          EquipMake = 0x10F,
          EquipModel = 0x110,
          StripOffsets = 0x111,
          Orientation = 0x112,
          SamplesPerPixel = 0x115,
          RowsPerStrip = 0x116,
          StripBytesCount = 0x117,
          MinSampleValue = 0x118,
          MaxSampleValue = 0x119,
          XResolution = 0x11A,
          YResolution = 0x11B,
          PlanarConfig = 0x11C,
          PageName = 0x11D,
          XPosition = 0x11E,
          YPosition = 0x11F,
          FreeOffset = 0x120,
          FreeByteCounts = 0x121,
          GrayResponseUnit = 0x122,
          GrayResponseCurve = 0x123,
          T4Option = 0x124,
          T6Option = 0x125,
          ResolutionUnit = 0x128,
          PageNumber = 0x129,
          TransferFuncition = 0x12D,
          SoftwareUsed = 0x131,
          DateTime = 0x132,
          Artist = 0x13B,
          HostComputer = 0x13C,
          Predictor = 0x13D,
          WhitePoint = 0x13E,
          PrimaryChromaticities = 0x13F,
          ColorMap = 0x140,
          HalftoneHints = 0x141,
          TileWidth = 0x142,
          TileLength = 0x143,
          TileOffset = 0x144,
          TileByteCounts = 0x145,
          InkSet = 0x14C,
          InkNames = 0x14D,
          NumberOfInks = 0x14E,
          DotRange = 0x150,
          TargetPrinter = 0x151,
          ExtraSamples = 0x152,
          SampleFormat = 0x153,
          SMinSampleValue = 0x154,
          SMaxSampleValue = 0x155,
          TransferRange = 0x156,
          JPEGProc = 0x200,
          JPEGInterFormat = 0x201,
          JPEGInterLength = 0x202,
          JPEGRestartInterval = 0x203,
          JPEGLosslessPredictors = 0x205,
          JPEGPointTransforms = 0x206,
          JPEGQTables = 0x207,
          JPEGDCTables = 0x208,
          JPEGACTables = 0x209,
          YCbCrCoefficients = 0x211,
          YCbCrSubsampling = 0x212,
          YCbCrPositioning = 0x213,
          REFBlackWhite = 0x214,
          ICCProfile = 0x8773,
          Gamma = 0x301,
          ICCProfileDescriptor = 0x302,
          SRGBRenderingIntent = 0x303,
          ImageTitle = 0x320,
          Copyright = 0x8298,
          ResolutionXUnit = 0x5001,
          ResolutionYUnit = 0x5002,
          ResolutionXLengthUnit = 0x5003,
          ResolutionYLengthUnit = 0x5004,
          PrintFlags = 0x5005,
          PrintFlagsVersion = 0x5006,
          PrintFlagsCrop = 0x5007,
          PrintFlagsBleedWidth = 0x5008,
          PrintFlagsBleedWidthScale = 0x5009,
          HalftoneLPI = 0x500A,
          HalftoneLPIUnit = 0x500B,
          HalftoneDegree = 0x500C,
          HalftoneShape = 0x500D,
          HalftoneMisc = 0x500E,
          HalftoneScreen = 0x500F,
          JPEGQuality = 0x5010,
          GridSize = 0x5011,
          ThumbnailFormat = 0x5012,
          ThumbnailWidth = 0x5013,
          ThumbnailHeight = 0x5014,
          ThumbnailColorDepth = 0x5015,
          ThumbnailPlanes = 0x5016,
          ThumbnailRawBytes = 0x5017,
          ThumbnailSize = 0x5018,
          ThumbnailCompressedSize = 0x5019,
          ColorTransferFunction = 0x501A,
          ThumbnailData = 0x501B,
          ThumbnailImageWidth = 0x5020,
          ThumbnailImageHeight = 0x502,
          ThumbnailBitsPerSample = 0x5022,
          ThumbnailCompression = 0x5023,
          ThumbnailPhotometricInterp = 0x5024,
          ThumbnailImageDescription = 0x5025,
          ThumbnailEquipMake = 0x5026,
          ThumbnailEquipModel = 0x5027,
          ThumbnailStripOffsets = 0x5028,
          ThumbnailOrientation = 0x5029,
          ThumbnailSamplesPerPixel = 0x502A,
          ThumbnailRowsPerStrip = 0x502B,
          ThumbnailStripBytesCount = 0x502C,
          ThumbnailResolutionX = 0x502D,
          ThumbnailResolutionY = 0x502E,
          ThumbnailPlanarConfig = 0x502F,
          ThumbnailResolutionUnit = 0x5030,
          ThumbnailTransferFunction = 0x5031,
          ThumbnailSoftwareUsed = 0x5032,
          ThumbnailDateTime = 0x5033,
          ThumbnailArtist = 0x5034,
          ThumbnailWhitePoint = 0x5035,
          ThumbnailPrimaryChromaticities = 0x5036,
          ThumbnailYCbCrCoefficients = 0x5037,
          ThumbnailYCbCrSubsampling = 0x5038,
          ThumbnailYCbCrPositioning = 0x5039,
          ThumbnailRefBlackWhite = 0x503A,
          ThumbnailCopyRight = 0x503B,
          LuminanceTable = 0x5090,
          ChrominanceTable = 0x5091,
          FrameDelay = 0x5100,
          LoopCount = 0x5101,
          PixelUnit = 0x5110,
          PixelPerUnitX = 0x5111,
          PixelPerUnitY = 0x5112,
          PaletteHistogram = 0x5113,
          ExifExposureTime = 0x829A,
          ExifFNumber = 0x829D,
          ExifExposureProg = 0x8822,
          ExifSpectralSense = 0x8824,
          ExifISOSpeed = 0x8827,
          ExifOECF = 0x8828,
          ExifVer = 0x9000,
          ExifDTOrig = 0x9003,
          ExifDTDigitized = 0x9004,
          ExifCompConfig = 0x9101,
          ExifCompBPP = 0x9102,
          ExifShutterSpeed = 0x9201,
          ExifAperture = 0x9202,
          ExifBrightness = 0x9203,
          ExifExposureBias = 0x9204,
          ExifMaxAperture = 0x9205,
          ExifSubjectDist = 0x9206,
          ExifMeteringMode = 0x9207,
          ExifLightSource = 0x9208,
          ExifFlash = 0x9209,
          ExifFocalLength = 0x920A,
          ExifMakerNote = 0x927C,
          ExifUserComment = 0x9286,
          ExifDTSubsec = 0x9290,
          ExifDTOrigSS = 0x9291,
          ExifDTDigSS = 0x9292,
          ExifFPXVer = 0xA000,
          ExifColorSpace = 0xA001,
          ExifPixXDim = 0xA002,
          ExifPixYDim = 0xA003,
          ExifRelatedWav = 0xA004,
          ExifInterop = 0xA005,
          ExifFlashEnergy = 0xA20B,
          ExifSpatialFR = 0xA20C,
          ExifFocalXRes = 0xA20E,
          ExifFocalYRes = 0xA20F,
          ExifFocalResUnit = 0xA210,
          ExifSubjectLoc = 0xA214,
          ExifExposureIndex = 0xA215,
          ExifSensingMethod = 0xA217,
          ExifFileSource = 0xA300,
          ExifSceneType = 0xA301,
          ExifCfaPattern = 0xA302,
          GpsVer = 0x0,
          GpsLatitudeRef = 0x1,
          GpsLatitude = 0x2,
          GpsLongitudeRef = 0x3,
          GpsLongitude = 0x4,
          GpsAltitudeRef = 0x5,
          GpsAltitude = 0x6,
          GpsGpsTime = 0x7,
          GpsGpsSatellites = 0x8,
          GpsGpsStatus = 0x9,
          GpsGpsMeasureMode = 0xA,
          GpsGpsDop = 0xB,
          GpsSpeedRef = 0xC,
          GpsSpeed = 0xD,
          GpsTrackRef = 0xE,
          GpsTrack = 0xF,
          GpsImgDirRef = 0x10,
          GpsImgDir = 0x11,
          GpsMapDatum = 0x12,
          GpsDestLatRef = 0x13,
          GpsDestLat = 0x14,
          GpsDestLongRef = 0x15,
          GpsDestLong = 0x16,
          GpsDestBearRef = 0x17,
          GpsDestBear = 0x18,
          GpsDestDistRef = 0x19,
          GpsDestDist = 0x1A
          }


          //
          // Real position of 0th row and column of picture
          //
          //
          //
          // [altair] 10.09.2003 Created
          //

          public enum Orientations
          {
          TopLeft = 1,
          TopRight = 2,
          BottomRight = 3,
          BottomLeft = 4,
          LeftTop = 5,
          RightTop = 6,
          RightBottom = 7,
          LftBottom = 8
          }


          //
          // Exposure programs
          //
          //
          //
          // [altair] 10.09.2003 Created
          //

          public enum ExposurePrograms
          {
          Manual = 1,
          Normal = 2,
          AperturePriority = 3,
          ShutterPriority = 4,
          Creative = 5,
          Action = 6,
          Portrait = 7,
          Landscape = 8,
          }


          //
          // Exposure metering modes
          //
          //
          //
          // [altair] 10.09.2003 Created
          //

          public enum ExposureMeteringModes
          {
          Unknown = 0,
          Average = 1,
          CenterWeightedAverage = 2,
          Spot = 3,
          MultiSpot = 4,
          MultiSegment = 5,
          Partial = 6,
          Other = 255
          }


          //
          // Flash activity modes
          //
          //
          //
          // [altair] 10.09.2003 Created
          //

          public enum FlashModes
          {
          NotFired = 0,
          Fired = 1,
          FiredButNoStrobeReturned = 5,
          FiredAndStrobeReturned = 7,
          }


          //
          // Possible light sources (white balance)
          //
          //
          //
          // [altair] 10.09.2003 Created
          //

          public enum LightSources
          {
          Unknown = 0,
          Daylight = 1,
          Fluorescent = 2,
          Tungsten = 3,
          Flash = 10,
          StandardLightA = 17,
          StandardLightB = 18,
          StandardLightC = 19,
          D55 = 20,
          D65 = 21,
          D75 = 22,
          Other = 255
          }


          //
          // EXIF data types
          //
          //
          //
          // [altair] 12.6.2004 Created
          //
          public enum ExifDataTypes : short
          {
          UnsignedByte = 1,
          AsciiString = 2,
          UnsignedShort = 3,
          UnsignedLong = 4,
          UnsignedRational = 5,
          SignedByte = 6,
          Undefined = 7,
          SignedShort = 8,
          SignedLong = 9,
          SignedRational = 10,
          SingleFloat = 11,
          DoubleFloat = 12
          }


          //
          // Represents rational which is type of some Exif properties
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public struct Rational
          {
          public Int32 Numerator;
          public Int32 Denominator;


          //
          // Converts rational to string representation
          //
          // Optional, default "/". String to be used as delimiter of components.
          // String representation of the rational.
          //
          //
          // [altair] 10.09.2003 Created
          //

          public override string ToString()
          {
          return ToString("/");
          }

          public string ToString(string Delimiter)
          {
          return Numerator + "/" + Denominator;
          }

          //
          // Converts rational to double precision real number
          //
          // The rational as double precision real number.
          //
          //
          // [altair] 10.09.2003 Created
          //

          public double ToDouble()
          {
          return (double)Numerator / Denominator;
          }
          }

          #endregion

          //
          // Initializes new instance of this class.
          //
          // Bitmap to read exif information from
          //
          //
          // [altair] 10.09.2003 Created
          //
          public ExifManager(System.Drawing.Bitmap Bitmap)
          {
          if (Bitmap == null)
          throw new ArgumentNullException("Bitmap");
          this._Image = Bitmap;
          }

          //
          // Initializes new instance of this class.
          //
          // Name of file to be loaded
          //
          //
          // [altair] 13.06.2004 Created
          //
          public ExifManager(string FileName)
          {
          this._Image = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromFile(FileName);
          }

          //
          // Get or set encoding used for string metadata
          //
          // Encoding used for string metadata
          // Default encoding is UTF-8
          //
          // [altair] 11.07.2004 Created
          // [altair] 05.09.2005 Changed from shared to instance member
          //
          public System.Text.Encoding Encoding
          {
          get
          {
          return this._Encoding;
          }
          set
          {
          if (value == null)
          throw new ArgumentNullException();
          this._Encoding = value;
          }
          }

          //
          // Returns copy of bitmap this instance is working on
          //
          //
          //
          //
          // [altair] 13.06.2004 Created
          //
          public System.Drawing.Bitmap GetBitmap()
          {
          return (System.Drawing.Bitmap)this._Image.Clone();
          }

          //
          // Returns all available data in formatted string form
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public override string ToString()
          {
          System.Text.StringBuilder SB = new StringBuilder();

          SB.Append("照片信息:");
          SB.Append("\n\t尺寸: " + this.Width + " x " + this.Height + " px");
          SB.Append("\n\t分辨率: " + this.ResolutionX + " x " + this.ResolutionY + " dpi");
          SB.Append("\n\t方向: " + Enum.GetName(typeof(Orientations), this.Orientation));
          SB.Append("\n\t標題: " + this.Title);
          SB.Append("\n\t描述: " + this.Description);
          SB.Append("\n\t作者: " + this.Artist);
          SB.Append("\n\t版權信息: " + this.Copyright);
          SB.Append("\n相機信息:");
          SB.Append("\n\t制造商: " + this.EquipmentMaker);
          SB.Append("\n\t型號: " + this.EquipmentModel);
          SB.Append("\n\t編輯軟件: " + this.Software);
          SB.Append("\n時間信息:");
          SB.Append("\n\t最后編輯時間: " + this.DateTimeLastModified.ToString());
          SB.Append("\n\t原始拍照時間: " + this.DateTimeOriginal.ToString());
          SB.Append("\n\t數字化時間: " + this.DateTimeDigitized.ToString());
          SB.Append("\n拍攝信息:");
          SB.Append("\n\t曝光時間: " + this.ExposureTime.ToString("N4") + " s");
          SB.Append("\n\t曝光模式: " + Enum.GetName(typeof(ExposurePrograms), this.ExposureProgram));
          SB.Append("\n\t測光模式: " + Enum.GetName(typeof(ExposureMeteringModes), this.ExposureMeteringMode));
          SB.Append("\n\t光圈值: F" + this.Aperture.ToString("N1"));
          SB.Append("\n\tISO感光度: " + this.ISO);
          SB.Append("\n\t拍攝距離: " + this.SubjectDistance.ToString("N2") + " m");
          SB.Append("\n\t焦距: " + this.FocalLength + " mm");
          SB.Append("\n\t閃光燈: " + Enum.GetName(typeof(FlashModes), this.FlashMode));
          SB.Append("\n\t白平衡(WB): " + Enum.GetName(typeof(LightSources), this.LightSource));
          //SB.Replace("\n", vbCrLf);
          //SB.Replace("\t", vbTab);
          return SB.ToString();
          }

          #region Nicely formatted well-known properties

          //
          // Brand of equipment (EXIF EquipMake)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string EquipmentMaker
          {
          get
          {
          return this.GetPropertyString((int)TagNames.EquipMake);
          }
          }

          //
          // Model of equipment (EXIF EquipModel)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string EquipmentModel
          {
          get
          {
          return this.GetPropertyString((int)TagNames.EquipModel);
          }
          }

          //
          // Software used for processing (EXIF Software)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string Software
          {
          get
          {
          return this.GetPropertyString((int)TagNames.SoftwareUsed);
          }
          }

          //
          // Orientation of image (position of row 0, column 0) (EXIF Orientation)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public Orientations Orientation
          {
          get
          {
          Int32 X = this.GetPropertyInt16((int)TagNames.Orientation);

          if (!Enum.IsDefined(typeof(Orientations), X))
          return Orientations.TopLeft;
          else
          return (Orientations)Enum.Parse(typeof(Orientations), Enum.GetName(typeof(Orientations), X));
          }
          }

          //
          // Time when image was last modified (EXIF DateTime).
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public DateTime DateTimeLastModified
          {
          get
          {
          try
          {
          return DateTime.ParseExact(this.GetPropertyString((int)TagNames.DateTime), @"yyyy\:MM\:dd HH\:mm\:ss", null);
          }
          catch
          {
          return DateTime.MinValue;
          }
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.DateTime, value.ToString(@"yyyy\:MM\:dd HH\:mm\:ss"));
          }
          catch
          { }
          }
          }

          //
          // Time when image was taken (EXIF DateTimeOriginal).
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public DateTime DateTimeOriginal
          {
          get
          {
          try
          {
          return DateTime.ParseExact(this.GetPropertyString((int)TagNames.ExifDTOrig), @"yyyy\:MM\:dd HH\:mm\:ss", null);
          }
          catch
          {
          return DateTime.MinValue;
          }
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.ExifDTOrig, value.ToString(@"yyyy\:MM\:dd HH\:mm\:ss"));
          }
          catch
          { }
          }
          }

          //
          // Time when image was digitized (EXIF DateTimeDigitized).
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public DateTime DateTimeDigitized
          {
          get
          {
          try
          {
          return DateTime.ParseExact(this.GetPropertyString((int)TagNames.ExifDTDigitized), @"yyyy\:MM\:dd HH\:mm\:ss", null);
          }
          catch
          {
          return DateTime.MinValue;
          }
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.ExifDTDigitized, value.ToString(@"yyyy\:MM\:dd HH\:mm\:ss"));
          }
          catch
          { }
          }
          }

          //
          // Image width
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 04.09.2005 Changed output to Int32, load from image instead of EXIF
          //
          public Int32 Width
          {
          get { return this._Image.Width; }
          }

          //
          // Image height
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 04.09.2005 Changed output to Int32, load from image instead of EXIF
          //
          public Int32 Height
          {
          get { return this._Image.Height; }
          }

          //
          // X resolution in dpi (EXIF XResolution/ResolutionUnit)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double ResolutionX
          {
          get
          {
          double R = this.GetPropertyRational((int)TagNames.XResolution).ToDouble();

          if (this.GetPropertyInt16((int)TagNames.ResolutionUnit) == 3)
          {
          // -- resolution is in points/cm
          return R * 2.54;
          }
          else
          {
          // -- resolution is in points/inch
          return R;
          }
          }
          }

          //
          // Y resolution in dpi (EXIF YResolution/ResolutionUnit)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double ResolutionY
          {
          get
          {
          double R = this.GetPropertyRational((int)TagNames.YResolution).ToDouble();

          if (this.GetPropertyInt16((int)TagNames.ResolutionUnit) == 3)
          {
          // -- resolution is in points/cm
          return R * 2.54;
          }
          else
          {
          // -- resolution is in points/inch
          return R;
          }
          }
          }

          //
          // Image title (EXIF ImageTitle)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string Title
          {
          get
          {
          return this.GetPropertyString((int)TagNames.ImageTitle);
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.ImageTitle, value);
          }
          catch { }
          }
          }

          //
          // User comment (EXIF UserComment)
          //
          //
          //
          //
          // [altair] 13.06.2004 Created
          //
          public string UserComment
          {
          get
          {
          return this.GetPropertyString((int)TagNames.ExifUserComment);
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.ExifUserComment, value);
          }
          catch { }
          }
          }

          //
          // Artist name (EXIF Artist)
          //
          //
          //
          //
          // [altair] 13.06.2004 Created
          //
          public string Artist
          {
          get
          {
          return this.GetPropertyString((int)TagNames.Artist);
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.Artist, value);
          }
          catch { }
          }
          }

          //
          // Image description (EXIF ImageDescription)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string Description
          {
          get
          {
          return this.GetPropertyString((int)TagNames.ImageDescription);
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.ImageDescription, value);
          }
          catch { }
          }
          }

          //
          // Image copyright (EXIF Copyright)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public string Copyright
          {
          get
          {
          return this.GetPropertyString((int)TagNames.Copyright);
          }
          set
          {
          try
          {
          this.SetPropertyString((int)TagNames.Copyright, value);
          }
          catch { }
          }
          }


          //
          // Exposure time in seconds (EXIF ExifExposureTime/ExifShutterSpeed)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double ExposureTimeAbs
          {
          get
          {
          if (this.IsPropertyDefined((int)TagNames.ExifExposureTime))
          // -- Exposure time is explicitly specified
          return this.GetPropertyRational((int)TagNames.ExifExposureTime).ToDouble();
          else
          if (this.IsPropertyDefined((int)TagNames.ExifShutterSpeed))
          //'-- Compute exposure time from shutter spee
          return (1 / Math.Pow(2, this.GetPropertyRational((int)TagNames.ExifShutterSpeed).ToDouble()));
          else
          // -- Can't figure out
          return 0;
          }
          }

          public Rational ExposureTime
          {
          get
          {
          if (this.IsPropertyDefined((int)TagNames.ExifExposureTime))
          // -- Exposure time is explicitly specified
          return this.GetPropertyRational((int)TagNames.ExifExposureTime);
          else
          return new Rational();
          }
          }

          //
          // Aperture value as F number (EXIF ExifFNumber/ExifApertureValue)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double Aperture
          {
          get
          {
          if (this.IsPropertyDefined((int)TagNames.ExifFNumber))
          return this.GetPropertyRational((int)TagNames.ExifFNumber).ToDouble();
          else
          if (this.IsPropertyDefined((int)TagNames.ExifAperture))
          return Math.Pow(System.Math.Sqrt(2), this.GetPropertyRational((int)TagNames.ExifAperture).ToDouble());
          else
          return 0;
          }
          }

          //
          // Exposure program used (EXIF ExifExposureProg)
          //
          //
          // If not specified, returns Normal (2)
          //
          // [altair] 10.09.2003 Created
          //
          public ExposurePrograms ExposureProgram
          {
          get
          {
          Int32 X = this.GetPropertyInt16((int)TagNames.ExifExposureProg);

          if (Enum.IsDefined(typeof(ExposurePrograms), X))
          return (ExposurePrograms)Enum.Parse(typeof(ExposurePrograms), Enum.GetName(typeof(ExposurePrograms), X));
          else
          return ExposurePrograms.Normal;
          }
          }

          //
          // ISO sensitivity
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public Int16 ISO
          {
          get { return this.GetPropertyInt16((int)TagNames.ExifISOSpeed); }
          }

          //
          // Subject distance in meters (EXIF SubjectDistance)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double SubjectDistance
          {
          get { return this.GetPropertyRational((int)TagNames.ExifSubjectDist).ToDouble(); }
          }

          //
          // Exposure method metering mode used (EXIF MeteringMode)
          //
          //
          // If not specified, returns Unknown (0)
          //
          // [altair] 10.09.2003 Created
          //
          public ExposureMeteringModes ExposureMeteringMode
          {
          get
          {
          Int32 X = this.GetPropertyInt16((int)TagNames.ExifMeteringMode);

          if (Enum.IsDefined(typeof(ExposureMeteringModes), X))
          return (ExposureMeteringModes)Enum.Parse(typeof(ExposureMeteringModes), Enum.GetName(typeof(ExposureMeteringModes), X));
          else
          return ExposureMeteringModes.Unknown;
          }
          }

          //
          // Focal length of lenses in mm (EXIF FocalLength)
          //
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public double FocalLength
          {
          get { return this.GetPropertyRational((int)TagNames.ExifFocalLength).ToDouble(); }
          }

          //
          // Flash mode (EXIF Flash)
          //
          //
          // If not present, value NotFired (0) is returned
          //
          // [altair] 10.09.2003 Created
          //
          public FlashModes FlashMode
          {
          get
          {
          Int32 X = this.GetPropertyInt16((int)TagNames.ExifFlash);

          if (Enum.IsDefined(typeof(FlashModes), X))
          return (FlashModes)Enum.Parse(typeof(FlashModes), Enum.GetName(typeof(FlashModes), X));
          else
          return FlashModes.NotFired;
          }
          }

          //
          // Light source / white balance (EXIF LightSource)
          //
          //
          // If not specified, returns Unknown (0).
          //
          // [altair] 10.09.2003 Created
          //
          public LightSources LightSource
          {
          get
          {
          Int32 X = this.GetPropertyInt16((int)TagNames.ExifLightSource);

          if (Enum.IsDefined(typeof(LightSources), X))
          return (LightSources)Enum.Parse(typeof(LightSources), Enum.GetName(typeof(LightSources), X));
          else
          return LightSources.Unknown;
          }
          }

          #endregion

          #region Support methods for working with EXIF properties

          //
          // Checks if current image has specified certain property
          //
          //
          // True if image has specified property, False otherwise.
          //
          //
          // [altair] 10.09.2003 Created
          //
          public bool IsPropertyDefined(Int32 PID)
          {
          return (Array.IndexOf(this._Image.PropertyIdList, PID) > -1);
          }

          //
          // Gets specified Int32 property
          //
          // Property ID
          // Optional, default 0. Default value returned if property is not present.
          // Value of property or DefaultValue if property is not present.
          //
          //
          // [altair] 10.09.2003 Created
          //
          public Int32 GetPropertyInt32(Int32 PID)
          {
          return GetPropertyInt32(PID, 0);
          }

          public Int32 GetPropertyInt32(Int32 PID, Int32 DefaultValue)
          {
          if (IsPropertyDefined(PID))
          return GetInt32(this._Image.GetPropertyItem(PID).Value);
          else
          return DefaultValue;
          }

          //
          // Gets specified Int16 property
          //
          // Property ID
          // Optional, default 0. Default value returned if property is not present.
          // Value of property or DefaultValue if property is not present.
          //
          //
          // [altair] 10.09.2003 Created
          //
          public Int16 GetPropertyInt16(Int32 PID)
          {
          return GetPropertyInt16(PID, 0);
          }

          public Int16 GetPropertyInt16(Int32 PID, Int16 DefaultValue)
          {
          if (IsPropertyDefined(PID))
          return GetInt16(this._Image.GetPropertyItem(PID).Value);
          else
          return DefaultValue;
          }

          //
          // Gets specified string property
          //
          // Property ID
          // Optional, default String.Empty. Default value returned if property is not present.
          //
          // Value of property or DefaultValue if property is not present.
          //
          // [altair] 10.09.2003 Created
          //
          public string GetPropertyString(Int32 PID)
          {
          return GetPropertyString(PID, "");
          }

          public string GetPropertyString(Int32 PID, string DefaultValue)
          {
          if (IsPropertyDefined(PID))
          return GetString(this._Image.GetPropertyItem(PID).Value);
          else
          return DefaultValue;
          }

          //
          // Gets specified property in raw form
          //
          // Property ID
          // Optional, default Nothing. Default value returned if property is not present.
          //
          // Is recommended to use typed methods (like etc.) instead, when possible.
          //
          // [altair] 05.09.2005 Created
          //
          public byte[] GetProperty(Int32 PID, byte[] DefaultValue)
          {
          if (IsPropertyDefined(PID))
          return this._Image.GetPropertyItem(PID).Value;
          else
          return DefaultValue;
          }

          public byte[] GetProperty(Int32 PID)
          {
          return GetProperty(PID, null);
          }

          //
          // Gets specified rational property
          //
          // Property ID
          //
          // Value of property or 0/1 if not present.
          //
          // [altair] 10.09.2003 Created
          //
          public Rational GetPropertyRational(Int32 PID)
          {
          if (IsPropertyDefined(PID))
          return GetRational(this._Image.GetPropertyItem(PID).Value);
          else
          {
          Rational R;
          R.Numerator = 0;
          R.Denominator = 1;
          return R;
          }
          }

          //
          // Sets specified string property
          //
          // Property ID
          // Value to be set
          //
          //
          // [altair] 12.6.2004 Created
          //
          public void SetPropertyString(Int32 PID, string Value)
          {
          byte[] Data = this._Encoding.GetBytes(Value + '\0');
          SetProperty(PID, Data, ExifDataTypes.AsciiString);
          }

          //
          // Sets specified Int16 property
          //
          // Property ID
          // Value to be set
          //
          //
          // [altair] 12.6.2004 Created
          //
          public void SetPropertyInt16(Int32 PID, Int16 Value)
          {
          byte[] Data = new byte[2];
          Data[0] = (byte)(Value & 0xFF);
          Data[1] = (byte)((Value & 0xFF00) >> 8);
          SetProperty(PID, Data, ExifDataTypes.SignedShort);
          }

          //
          // Sets specified Int32 property
          //
          // Property ID
          // Value to be set
          //
          //
          // [altair] 13.06.2004 Created
          //
          public void SetPropertyInt32(Int32 PID, Int32 Value)
          {
          byte[] Data = new byte[4];
          for (int I = 0; I < 4; I++)
          {
          Data[I] = (byte)(Value & 0xFF);
          Value >>= 8;
          }
          SetProperty(PID, Data, ExifDataTypes.SignedLong);
          }

          //
          // Sets specified property in raw form
          //
          // Property ID淘寶網女裝夏裝新款
          // Raw data
          // EXIF data type
          // Is recommended to use typed methods (like etc.) instead, when possible.
          //
          // [altair] 12.6.2004 Created
          //
          public void SetProperty(Int32 PID, byte[] Data, ExifDataTypes Type)
          {
          System.Drawing.Imaging.PropertyItem P = this._Image.PropertyItems[0];
          P.Id = PID;
          P.Value = Data;
          P.Type = (Int16)Type;
          P.Len = Data.Length;
          this._Image.SetPropertyItem(P);
          }

          //
          // Reads Int32 from EXIF bytearray.
          //
          // EXIF bytearray to process
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 05.09.2005 Changed from public shared to private instance method
          //
          private Int32 GetInt32(byte[] B)
          {
          if (B.Length < 4)
          throw new ArgumentException("Data too short (4 bytes expected)", "B");

          return B[3] << 24 | B[2] << 16 | B[1] << 8 | B[0];
          }

          //
          // Reads Int16 from EXIF bytearray.
          //
          // EXIF bytearray to process
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 05.09.2005 Changed from public shared to private instance method
          //
          private Int16 GetInt16(byte[] B)
          {
          if (B.Length < 2)
          throw new ArgumentException("Data too short (2 bytes expected)", "B");

          return (short)(B[1] << 8 | B[0]);
          }

          //
          // Reads string from EXIF bytearray.
          //
          // EXIF bytearray to process
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 05.09.2005 Changed from public shared to private instance method
          //
          private string GetString(byte[] B)
          {
          string R = this._Encoding.GetString(B);
          if (R.EndsWith("\0"))
          R = R.Substring(0, R.Length - 1);
          return R;
          }

          //
          // Reads rational from EXIF bytearray.
          //
          // EXIF bytearray to process
          //
          //
          //
          // [altair] 10.09.2003 Created
          // [altair] 05.09.2005 Changed from public shared to private instance method
          //
          private Rational GetRational(byte[] B)
          {
          Rational R = new Rational();
          byte[] N = new byte[4];
          byte[] D = new byte[4];
          Array.Copy(B, 0, N, 0, 4);
          Array.Copy(B, 4, D, 0, 4);
          R.Denominator = this.GetInt32(D);
          R.Numerator = this.GetInt32(N);
          return R;
          }

          public void Save(string fileName){
              this._Image.Save(fileName);
          }
          #endregion

          #region " IDisposable implementation "

          //
          // Disposes unmanaged resources of this class
          //
          //
          //
          // [altair] 10.09.2003 Created
          //
          public void Dispose()
          {
          this._Image.Dispose();
          }

          #endregion

          }
          }
          posted on 2011-05-24 16:57 墻頭草 閱讀(1539) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          人人游戲網 軟件開發(fā)網 貨運專家
          主站蜘蛛池模板: 仁化县| 阳原县| 巨野县| 嵩明县| 临湘市| 即墨市| 宜兰市| 南宫市| 石林| 井研县| 阳新县| 馆陶县| 弥渡县| 漳平市| 仁布县| 竹山县| 白河县| 城固县| 方山县| 宁陵县| 宿迁市| 织金县| 崇文区| 河源市| 区。| 衡阳市| 九龙城区| 福安市| 神农架林区| 景谷| 长白| 遵化市| 叶城县| 吴堡县| 文山县| 洱源县| 湖北省| 海安县| 正宁县| 自治县| 鄱阳县|