- 浏览: 396795 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
c253898303:
求和的时候说是调用store的基础方法,这个能重写吗?如果可以 ...
给Extjs的GridPanel增加“合计”行 -
rhhao:
这个附件怎么用呢?
自己写段代码批量修改照片的Exif数据 -
AndLong:
【转】关于烂代码的那些事(下) -
TonyLian:
无意中翻出这篇老博文,文章中留下的遗憾“纯JSP如何获取req ...
Spring获得各种客户端HttpServletRequest的方法 -
TonyLian:
注释中应该写“这里为什么要做XXX”,“为什么这里没有做XXX ...
【转】关于烂代码的那些事(中)
老爸老妈去欧洲画了一个圈,带回来一千多张照片(数量没法和年轻人比)。
虽然老爸晓得调节相机中的时间,但是毕竟年岁不饶人,整差了12个小时。
也就是下午4点拍的照片,Exif里显示是凌晨4点。
好在欧洲大陆都用相同的时区(偶没去过,不晓得,只是老爸说导游都是这样执行的),每张都 +12H 即可。
基本各种照片查看工具都有批量修改功能,但无奈咱需要“时间+12H”确谁也没有。
咋办?自己写段代码吧。
由于用途单一,且是一锤子买卖,就没有“修饰”各种选项、配置,有需要的童鞋可以进一步完善。
(代码是在以前写的一个查看Exif小程序的基础上写的,提供整个工程下载)
this.EquipmentModel
虽然老爸晓得调节相机中的时间,但是毕竟年岁不饶人,整差了12个小时。
也就是下午4点拍的照片,Exif里显示是凌晨4点。
好在欧洲大陆都用相同的时区(偶没去过,不晓得,只是老爸说导游都是这样执行的),每张都 +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 } }
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Design; /** * 对话框工具 * * @author LianTao * @version 1.0 2008.11.01 */ namespace Utils { public class DialogUtil : FolderNameEditor { FolderNameEditor.FolderBrowser fDialog = new System.Windows.Forms.Design.FolderNameEditor.FolderBrowser(); /** * 构造函数 */ public DialogUtil() { } /** * 打开“浏览”对话框 */ public DialogResult ShowFolderDialog() { return ShowFolderDialog("请选择一个文件夹"); } /** * 打开“浏览”对话框 * * @param description * 对话框的标题 */ public DialogResult ShowFolderDialog(string description) { fDialog.Description = description; fDialog.StartLocation = FolderBrowserFolder.Desktop; return fDialog.ShowDialog(); } ~DialogUtil() { fDialog.Dispose(); } }
- ExifShow.rar (77.7 KB)
- 下载次数: 144
评论
4 楼
rhhao
2016-08-20
这个附件怎么用呢?
3 楼
savasun
2013-07-20
这个类是哪个开源站找的
2 楼
TonyLian
2012-11-19
bod22 写道
怎样修改 相机名称
this.EquipmentModel
1 楼
bod22
2012-09-06
怎样修改 相机名称
发表评论
-
让照片在Apple(iphone / iPad)上显示在地图中正确的位置
2012-05-17 16:27 24241太久没来这里了,这两 ... -
读《C# 和 Java 的比较》有感
2009-06-04 11:44 20074网上的一篇《C# 和 Java 的比较》(或者叫《Java 和 ... -
C#基础知识(MSDN整理)
2009-05-27 22:14 3565C#基础知识(MSDN整理) 一:C# 介绍 ... -
JAVA程序员看C#的精华与糟粕
2009-05-16 21:18 1275转载一篇,以后研究C# ... -
ArrayList的使用方法
2009-05-12 11:10 1860今天又重新整理了一下和集合类型相关的3篇文章,温故而知新。 ... -
VS2005 C#学习实践笔记
2009-05-10 22:34 3077《VS2005 C#学习实践笔记 ...
相关推荐
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码...python批量修改照片exif信息,修改gps信息,给有需要批量修改照片地理位置信息的做个参考
Jhead- 批量修改照片Exif信息.docx
如果jpeg文件没有exif或者exif中的创建时间不可用,则将文件名修改为文件的“修改时间”。 默认的格式-顺序为MMDD-HHMMSS 格式-顺序参数如下: %d-日(01-31) %H-小时(00-23) %j-一年中的第几天(001-366) %m-月(01-12...
EXIF(Exchangeable image file format)是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。该代码读取该信息,供用户或编程使用。
支持批量修改照片exit属性,免费简单易用 DOS命令方式 exiftool.exe "-DateTimeOriginal+=0:00:60 11:22:0" F:\DCIM\100_FUJI 这个命令是把目录中所有文件的拍摄日期往后挪0年0个月60天 11小时22分钟 exiftool.exe ...
修改图片exif信息示例(使用MediaUtil)
修改图像Exif数据: 5种使用 Python 读取和修改图像 EXIF 元数据的方法 https://blog.csdn.net/lmj2006/article/details/136991546
图片EXIF信息批量删除 此软件的功能是去除掉图片文件头的信息如摄影机型号,光圈,快门等
从图像中显示和删除 EXIF 数据的简单工具。只需选择图像,查看其中包含的数据并下载不包含数据的版本
一个现成更改照片时间的程式--jhead,由网页中,releases表里下载110k的十分好用。 下载jhead时,记得把jhead程序存放在要更改的照片文件夹里,不然无法使用。 它的强大在于它 一、提供了其他工具所不能企及的功能 ...
用C#读取图片的EXIF信息的方法(读取照片ISO等信息原代码)
修改图片exif信息,改成相机原图
图片 Exif 信息 编辑 【vb.net】
支持使用 Exif 标签和 GPS 标签给 JPEG 数码照片及图片批量更名; 支持正则表达式匹配和替换以及元变量表达式的插入;支持导出和导入更名方案和快照文件进行批量更名;支持更名操作保存为快照文件功能,以便在需要时...
PHP不用任何扩展读取图片EXIF信息的代码
photoinfoex是数码照片的软件,这将使编辑或修改一些有关的EXIF信息相关的IPTC或您的JPEG和TIFF文件,图像文件。 photoinfoex能读的EXIF ,制造商的IPTC和债券等领域,载于原照片档案。 photoinfoex提供了强大的导入...
例如照片“12345.jpg”,重命名后是“2007-11-17 18-41-44.jpg”。 如果按预设格式会产生同名文件,则程序自动添加#???后缀,例如“西安 2007-11-17 #008.jpg”。 文件名格式可以自定义。 1.2.0.0 需要.NET 2.0...
一个可以轻松修改图片的EXIF信息的修改器,中文版,轻松修改拍摄时间以及增加gps信息
本应用程序主要以对照片GPS信息的批量修改和导出为例,展示了照片EXIF信息查看和修改方法,还有其他属性修改、查看如出一辙,实例中已经包含基本所有类型的实现方法,各位可以根据照片信息在文件中的存储类型自己...