`
TonyLian
  • 浏览: 402067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己写段代码批量修改照片的Exif数据

阅读更多
老爸老妈去欧洲画了一个圈,带回来一千多张照片(数量没法和年轻人比)。

虽然老爸晓得调节相机中的时间,但是毕竟年岁不饶人,整差了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();
        }
    }

2
1
分享到:
评论
4 楼 rhhao 2016-08-20  
这个附件怎么用呢?
3 楼 savasun 2013-07-20  
这个类是哪个开源站找的
2 楼 TonyLian 2012-11-19  
bod22 写道
怎样修改 相机名称

this.EquipmentModel
1 楼 bod22 2012-09-06  
怎样修改 相机名称

相关推荐

    5种使用Python查看修改删除EXIF数据的方法

    本文将详细介绍5种使用Python查看、修改和删除EXIF数据的方法。 1. **PIL (Python Imaging Library)** PIL是Python中广泛使用的图像处理库,同时也支持读取和修改EXIF信息。首先,我们需要安装PIL库,可以使用`pip...

    批量照片重命名-按照片Exif中的拍摄时间日期

    在编程环境中,如Python,可以使用PIL(Python Imaging Library)或它的分支Pillow来读取图片的Exif数据。例如,以下代码段展示了如何获取照片的拍摄日期: ```python from PIL import Image import os def get_...

    基于Python的提取照片中的EXFI信息,支持批量提取

    4. **获取EXIF数据**:通过`_getexif()`方法获取图片的EXIF数据。如果图片没有EXIF信息,该方法将返回`None`。 ```python exif_data = img._getexif() ``` 5. **解析EXIF数据**:`_getexif()`返回的是一个字典...

    批量更改图片名称(VB源码)

    标题“批量更改图片名称(VB源码)”指的是使用VB编写的一段代码,用于自动化更改大量图片文件的名称。这个程序的核心功能是根据图片的拍摄时间或者最后修改时间来重命名图片,确保每个文件名都是唯一的,并且反映了...

    mediautil-1 修改图片 EXIF信息 内附测试类 及 源码

    `mediautil-1.0.jar`是一个便捷的Java库,它允许开发者直接读取和修改JPEG和TIFF格式图片的EXIF数据。这个工具的主要功能包括: 1. **读取EXIF信息**:可以获取图片的拍摄日期、相机型号、光圈、快门速度、ISO感光...

    该资源是EXIF提取图像头信息的例子

    在实际操作中,你可能需要先安装Exiv2库,然后编译并运行这个测试程序,查看其如何从图像文件中提取和显示EXIF数据。 为了实现这个功能,开发者需要了解一些基本的编程概念,如文件操作、内存管理以及库的引用和...

    图像批量重命名

    - **保持元数据**:确保在重命名过程中不会丢失图像的元数据,如EXIF信息,这些信息可能包含拍摄日期、相机参数等重要数据。 - **一致性**:设定明确的命名规则,并在整个库中保持一致,以便于后期检索。 - **避免...

    python两种方式实现读写航拍影像JPG图片的GPS坐标

    这段代码展示了如何读取JPG图片的GPS经度和纬度。 在`writegps2jpg_piexif.py`中,我们可能看到写入GPS坐标到图片的代码: ```python from piexif import dump, IFD, GPS def write_gps_to_jpg(filename, lat...

    Jhead简化包读取图片EXIF

    通过这样的封装,我们可以将Jhead的强大功能整合进自己的应用程序中,提供更直观、更易用的接口,从而提高工作效率,更好地管理和分析图片的EXIF数据。无论是进行数据分析、图像处理还是自动化工作流,掌握利用Jhead...

    jpeg 或 jpg 照片根据照片的修改时间批量重命名C++源代码

    批量重命名照片可以根据多种标准进行,例如文件创建时间、修改时间、元数据等。在这个特定的情况下,代码是基于照片的修改时间来执行重命名操作的。 首先,我们要理解“修改时间”这个概念。在计算机系统中,每个...

    自己写的缩略图批量处理工具,按照像素来缩放

    一个高效的方法是使用缩略图批量处理工具,如标题中提到的“自己写的缩略图批量处理工具,按照像素来缩放”。这个工具专门用于快速调整大量图像的尺寸,根据像素比例进行缩放,确保了图片质量的控制。 批量处理图像...

    批量修改文件名小工具plxgwjm.zip

    6. **元数据替换**:高级工具可能允许使用文件的元数据(如图片的EXIF信息)来生成新的文件名。 在使用“批量修改文件名小工具”时,用户首先需要选择要操作的文件夹,然后根据需求选择合适的重命名规则。在设置...

    PhotoShop给图片自动添加边框及EXIF信息的JS脚本

    9. 图片的批量处理:在脚本中,可以通过录制动作或直接编写代码来处理多张图片,从而实现批量修改图片属性、添加元数据、调整尺寸等功能。 10. 图片版权和EXIF信息的结合:在脚本中可以加入版权信息和创作者信息,...

    微信图片名字还原为时间软件

    标题中的“微信图片名字还原为时间软件”指的是一个专门针对微信聊天中下载的图片进行命名优化的工具。...通过查看或修改源码,开发者和编程爱好者还可以了解到如何解析和利用图片的元数据信息,提升自己的编程技能。

    originalPhotoDateUpdaterFromFolder:基于包含的文件夹名称的strftime格式更新文件的exif照片元数据

    5. 使用`PIL.ExifTags.save_exif()`方法保存修改后的Exif数据到图片文件。 在"originalPhotoDateUpdaterFromFolder-main"这个主文件中,很可能包含了实现上述逻辑的代码。这个脚本可能遍历指定的文件夹结构,递归地...

    php 图片信息获取扩展工具

    例如,通过分析图片的EXIF数据,你可以创建一个摄影社区,显示每张照片的拍摄地点和设备;或者在上传用户图片时,删除GPS坐标以保护用户隐私。 总之,PHP的EXIF扩展和`PHP_JPEG_Metadata_Toolkit_1.11`工具是强大且...

    ExifCleaner-3.6.0-源码.rar

    1. 图像读取模块:这部分代码负责解析并读取不同格式的图像文件,如JPEG、PNG、TIFF等,提取出其中的Exif数据。 2. Exif解析器:这个组件理解Exif标准,将二进制数据转换为人类可读的元数据形式。 3. 数据清理机制...

    照片GPS信息添加源码及程序.zip

    开发者可以通过阅读源代码了解如何操作EXIF数据,同时也可以借鉴其批量处理的实现方式,这对于需要处理大量照片的应用场景非常有价值。同时,这也为那些希望扩展其功能或将其整合到自己项目中的开发者提供了宝贵的...

    图片批量处理器程序.zip

    6. **元数据处理**:修改图片的EXIF信息,如拍摄日期、地点等。 7. **重命名**:批量更改图片文件名,方便管理和查找。 开发这样的程序需要对图像处理库有深入理解,比如在Python中可以使用PIL(Python Imaging ...

Global site tag (gtag.js) - Google Analytics