最近遇到个问题,客户要求上传的图片必须是照相机里的原始图片,图片一旦被修改不能上传,同时需要得到相机的一些参数
如:机器型号 、拍摄日期啊 等等
类似于保险公司的定损,不能上传修改的图片 同时必须是制定相机拍摄的
没什么头绪,谁能帮帮忙,先谢了。
如:机器型号 、拍摄日期啊 等等
类似于保险公司的定损,不能上传修改的图片 同时必须是制定相机拍摄的
没什么头绪,谁能帮帮忙,先谢了。
解决方案 »
- 模拟post, 中文传参
- 别的项目能输出ashx的hello world 这个项目不行
- 怎样表示表格中某行某列为空值
- 怎么触发页面按钮的点击事件
- gridview1控件绑定出错,怎么修改?
- sqlserver2000 与 sqlserver2005的问题
- 乱码问题
- 多重查询问题。。有语句重复,内有简短代码。。。注:头次发帖
- 如何在非 *.aspx.vb 的类中取得浏览器地址栏信息
- 怎末在服务器端Button控件的click 事件里响应Html button的click事件
- connectionstring属性尚未初始化是怎么回事,新手提问
- Repeater里的Eval("")能否配合多层判断语句?
用C#读取图片的EXIF信息
引言:
EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA --Japan Electronic Industry Development Association) 制订,目前的版本是修改发表于1998年6月的2.1版。国际标准化组织(ISO)正在制订的相机文件设计标准(DCF -- Design role for Camera File system)就是以EXIF2.1格式为基础而设定的。
记住,EXIF是一种图像文件格式,只是文件的后缀名还是沿用大家熟悉的jpg而已。实际上,EXIF信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的jpg文件的头部,也就是说EXIF信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过EXIF信息所记录的资讯更为详尽和完备。不过,具有EXIF信息的JPEG图像文件要比普通的JPEG文件略大一点。就目前市场而言,新一代的数码相机都具有附加EXIF信息功能,大多数的数码相机厂商也都会随数码相机发售时附赠能够读取EXIF信息的软件,例如 Nikon 系列的数码相机就附赠 NikonView 软件,Agfa系列的相机则附赠 Photowize V1.8版,而富士相机附送的EXIF viewer软件更是这方面的领军人物(目前已在很多网站提供免费下载。还有一部分的数码相机会自动将EXIF信息转存成文档文件,例如:NIKON CoolPix 990和SONY FD系列。除了硬件厂商随数码相机附带的EXIF信息查看软件,很多专业的图像软件厂商在这方面也不甘示弱,相继推出自己公司看图软件的最新版来支持这种近乎完美的JPEG-EXIF图像信息附加技术,如最近刚推出的ACDSee 4.0版本,就对现在流行的各种数码相机有相当好的支持,在EXIF图像信息附加方面较之其3.0版本也有很大的进步。不管是硬件厂商的配套软件还是专业名门的看图工具,所有这些软件都是为了方便数码摄影者能更方便地保存查看摄影图像的重要信息。
我们将这些读取EXIF信息的软件归纳后分为四类:专业EXIF信息查看工具(以富士的EXIF viewer为例) 、具有查看EXIF信息的强大通用看图工具(以ACDSee为例)、支持EXIF信息查看的操作系统(微软的Windows XP)以及可以修改EXIF信息的另类工具(EXIF Editer),而我们这里要讲的是通过C#在WEB上读取一个图片的EXIF信息。
二、代码实现
首先是提取图片信息的相关类,在此我把它整合成一个单独的类库中,以便直接拿来使用。
1.EXIFMetaData类
这个是与调用程序的接口,其中包含了EXIF的所有信息,都是处理过的,可直接使用。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
namespace EXIFInfo
{
/// <summary>
/// EXIFMetaData 的摘要说明。
/// </summary>
public class EXIFMetaData
{
#region 构造函数
/// <summary>
/// 构造函数
/// </summary>
public EXIFMetaData()
{
}
#endregion
#region 数据转换结构
/// <summary>
/// 转换数据结构
/// </summary>
public struct MetadataDetail
{
/// <summary>
/// 显示值串
/// </summary>
public string DisplayValue;//显示值串
}
#endregion
#region EXIF元素结构
/// <summary>
/// 结构:存储EXIF元素信息
/// </summary>
public struct Metadata
{
/// <summary>
/// 相片拍照日期
/// </summary>
public MetadataDetail DTDigitized;
/// <summary>
/// 设备制造商
/// </summary>
public MetadataDetail EquipmentMake;
/// <summary>
/// 曝光时间(秒)
/// </summary>
public MetadataDetail ExposureTime;
/// <summary>
/// 快门速度(秒)
/// </summary>
public MetadataDetail ShutterSpeed;
/// <summary>
/// 曝光模式
/// </summary>
public MetadataDetail MeteringMode;
/// <summary>
/// 闪光灯(开/关reserved)
/// </summary>
public MetadataDetail Flash;
/// <summary>
/// 水平分辩率(DPI)
/// </summary>
public MetadataDetail XResolution;
/// <summary>
/// 垂直分辩率(DPI)
/// </summary>
// 。//在此有很多相关的属性,不一一列出。有需要者可与我联系。
/// <summary>
/// 压缩(焦距)
/// </summary>
public MetadataDetail ThumbnailCompression;
/// <summary>
/// //----
/// </summary>
public MetadataDetail ThumbnailResolutionUnit;
/// <summary>
/// 摄影机型号
/// </summary>
public MetadataDetail EquipModel;
// 。//在此有很多相关的属性,不一一列出。有需要者可与我联系。
}
#endregion
#region 取得图片的EXIF信息
/// <summary>
/// 取得图片的EXIF信息
/// </summary>
/// <param name="PhotoName">图片物理路径</param>
/// <returns>图片类实体</returns>
public Metadata GetEXIFMetaData(string PhotoName)
{
// 创建一个图片的实例
System.Drawing.Bitmap bmp = new Bitmap(PhotoName);
EXIFextractor er = new EXIFextractor(ref bmp, "\n");
NameValueCollection items = new NameValueCollection();
//获取照片的相关信息
foreach (Pair pr in er)
{
items.Add(pr.First,pr.Second);
}
//自定义类属性付值
Metadata MyMetadata = new Metadata();
try
{
MyMetadata.DTDigitized.DisplayValue = items.Get("DTDigitized");
MyMetadata.EquipmentMake.DisplayValue = items.Get("Equip Make");
MyMetadata.ExposureProg.DisplayValue = items.Get("Exposure Prog");
MyMetadata.Aperture.DisplayValue = items.Get("Aperture");
MyMetadata.SensingMethod.DisplayValue = items.Get("Sensing Method");
MyMetadata.YResolution.DisplayValue = items.Get("Y Resolution");
MyMetadata.ExposureIndex.DisplayValue = items.Get("Exposure Index");
。//在此有很多相关的属性,不一一列出。有需要者可与我联系。
}
catch
{}
items.Clear();
return MyMetadata;
}
#endregion
}
}
此类是用来提前提取处理相关参数的。
using System;
using System.Text;
using System.Collections;
using System.Drawing.Imaging;
using System.Reflection;
using System.IO;
namespace EXIFInfo
{
/// <summary>
/// EXIFextractor 的摘要说明。
/// </summary>
public class EXIFextractor: IEnumerable
{
/// <summary>
/// Get the individual property value by supplying property name
/// These are the valid property names :
///
/// "Exif IFD"
/// "Gps IFD"
/// "New Subfile Type"
/// "Subfile Type"
//等等
/// "Gps DestDist"
/// </summary>
public object this[string index]
{
get
{
return properties[index];
}
}
//
private System.Drawing.Bitmap bmp;
//
private string data;
//
private translation myHash;
//
private Hashtable properties;
//
internal int Count
{
get
{
return this.properties.Count;
}
}
//
string sp;
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="data"></param>
public void setTag(int id, string data)
{
Encoding ascii = Encoding.ASCII;
this.setTag(id, data.Length, 0x2, ascii.GetBytes(data));
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="len"></param>
/// <param name="type"></param>
/// <param name="data"></param>
public void setTag(int id, int len, short type, byte[] data)
{
PropertyItem p = CreatePropertyItem(type, id, len, data);
this.bmp.SetPropertyItem(p);
buildDB(this.bmp.PropertyItems);
}
/// <summary>
///
/// </summary>
/// <param name="type"></param>
/// <param name="tag"></param>
/// <param name="len"></param>
/// <param name="value"></param>
/// <returns></returns>
private static PropertyItem CreatePropertyItem(short type, int tag, int len, byte[] value)
{
PropertyItem item;
// Loads a PropertyItem from a Jpeg image stored in the assembly as a resource.
Assembly assembly = Assembly.GetExecutingAssembly();
Stream emptyBitmapStream = assembly.GetManifestResourceStream("EXIFextractor.decoy.jpg");
System.Drawing.Image empty = System.Drawing.Image.FromStream(emptyBitmapStream);
item = empty.PropertyItems[0];
// Copies the data to the property item.
item.Type = type;
item.Len = len;
item.Id = tag;
item.Value = new byte[value.Length];
value.CopyTo(item.Value, 0);
return item;
}