将图片说明加入到jpg文件内,最简便的方法是:用16进制编辑器(或编个读写程序)直接把这部分信息写入jpg文件保存,不会对图像有任何影响。
在jpg文件开始两字节是FF D8,可以在它们后面插入以下35字节(如果在FF D8后面的是FF E0块,最好插入这个块后面,这个块的长度就是那两字节的TAG标志之后的两字节,长度不包括这两字节TAG,比如FF E0块是16字节长,那么FF ED块就应该在原文件第21字节前面插入):
FF ED 00 22 50 68 6F 74 6F 73 68 6F 70 20 33 2E 30 00 38 42 49 4D 04 04 00 00 00 00 00 05 1C 02 78 00 00
上面00 22表示这个FF ED块的长度(也是不包括TAG这两字节),注意到上面数据的字节数35-2=33,即00 21才对,但是本块最后还需要加一个00字节作为块结束符,所以预先写为00 22,后面还要修正的。所要添加的图片说明文字串应该在00结束符之前,比如“abcdef”的ASCII码是61 62 63 64 65 66,(说明文字可以用汉字),再加上结束符00。然后修改三处数字:1C 02 78是本块内的一种子块(以1C 02 ..的三字节形式为标识符,可能和FF ED信息块一样有不止一个),这种标识符后面两字(如上面的00 00)是该子块数据长度(如abcdef就应该是6字节,即00 06,不包括三字节标识符和两字节长度),这是第一处需要修正的数据;第二处是本块的第29、30两字节(如上面的00 05),修正方法是在原值基础上增加新旧说明文字改变的长度,比如原值05对应串长为0,新串若为6,即可增加6-0=6,所以原值应改为5+6=11(即16进制的0B);最后一处如果错了JPEG图像就不能显示了,应把FF ED后面的块长度数据00 22也加上文字说明改变的长度6,即00 28,这是本块最终的总长度-2字节标志占用。然后保存文件即可。如果原来jpg文件的Exif已经有这个图片说明信息(只搜索含有1C 02 78的FF ED块),应根据同样的原理直接在上面修改,因为显示Exif信息的图片说明的时候一般以最远离文件头的数据为准。
更多有关Exif信息访问www.exif.org,提供JEIDA制定的EXIF 2.1官方标准(1998.6.12)和2.2官方标准(2002.4)的PDF文件。
附一:写入JPEG图像EXIF信息的C#源代码
private void WriteNewDescriptionInImage(string Filename,string NewDescription) {
Image Pic;
PropertyItem[] PropertyItems;
byte[] bDescription=new Byte[NewDescription.Length];
int i;
string FilenameTemp;
Encoder Enc=Encoder.Transformation;
EncoderParameters EncParms=new EncoderParameters(1);
EncoderParameter EncParm;
ImageCodecInfo CodecInfo=GetEncoderInfo("image/jpeg");
// copy description into byte array
for (i=0;i<NewDescription.Length;i++) bDescription[i]=(byte)NewDescription[i];
// load the image to change
Pic=Image.FromFile(Filename);
// put the new description into the right property item
PropertyItems=Pic.PropertyItems;
PropertyItems[0].Id=0x010e; // 0x010e as specified in EXIF standard
PropertyItems[0].Type=2;
PropertyItems[0].Len=NewDescription.Length;
PropertyItems[0].Value=bDescription;
Pic.SetPropertyItem(PropertyItems[0]);
// we cannot store in the same image, so use a temporary image instead
FilenameTemp=Filename+".temp";
// for lossless rewriting must rotate the image by 90 degrees!
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate90);
EncParms.Param[0]=EncParm;
// now write the rotated image with new description
Pic.Save(FilenameTemp,CodecInfo,EncParms);
// for computers with low memory and large pictures: release memory now
Pic.Dispose();
Pic=null;
GC.Collect();
// delete the original file, will be replaced later
System.IO.File.Delete(Filename);
// now must rotate back the written picture
Pic=Image.FromFile(FilenameTemp);
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate270);
EncParms.Param[0]=EncParm;
Pic.Save(Filename,CodecInfo,EncParms);
// release memory now
Pic.Dispose();
Pic=null;
GC.Collect();
// delete the temporary picture
System.IO.File.Delete(FilenameTemp);
}
附二:以下资料来源http://www./cn/iexif/exif.htm
所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。
0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标准,检索出它们的具体含义,一般包括以下一些信息:
ImageDescription:图像描述、来源,指生成图像的工具
Artist:作者,有些相机可以输入使用者名字
Make:生产者,指产品生产厂家
Model:型号,指设备型号
Orientation:方向,有的相机支持
XResolution/YResolution:X/Y方向分辨率
ResolutionUnit:分辨率单位,一般为PPI
Software:软件,显示固件Firmware版本
DateTime:日期和时间
YCbCrPositioning:色相定位
ExifOffset:Exif信息位置,定义Exif信息在文件中的写入位置,有些软件不显示
ExposureTime:曝光时间,即快门速度
FNumber:光圈系数
ExposureProgram:曝光程序,指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等
ISOspeedratings:感光度
ExifVersion:Exif版本
DateTimeOriginal:创建时间
DateTimeDigitized:数字化时间
ComponentsConfiguration:图像构造(多指色彩组合方案)
CompressedBitsPerPixel (BPP):压缩时每像素色彩位,指压缩程度
ExposureBiasValue:曝光补偿
MaxApertureValue:最大光圈
MeteringMode:测光方式,平均式测光、中央重点测光、点测光等
LightSource:光源,指白平衡设置
Flash:是否使用闪光灯
FocalLength:焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距Maker Note (User Comment)作者标记、说明、记录
FlashPixVersion:FlashPix版本(个别机型支持)
ColorSpace:色域、色彩空间
ExifImageWidth (Pixel X Dimension):图像宽度,指横向像素数
ExifImageLength (Pixel Y Dimension):图像高度,指纵向像素数
Interoperability:IFD通用性扩展项定义指针,和TIFF文件相关,具体含义不详
FileSource:源文件
Compression:压缩比。
什么是EXIF?
Exif是英文Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA -- Japan Electronic Industry Development Association) 制订,目前的最新版本是2.21 版。国际标准化组织(ISO)正在制订的相机文件设计标准(DCF -- Design role for Camera File system)可能以Exif2.1为基础。
Exif文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件,但打开时可能看不到Exif信息,一旦修改,Exif信息可能丢失。
简单来说,EXIF信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的JPEG/TIFF文件的头部,也就是说EXIF信息是镶嵌在JPEG/TIFF图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过EXIF信息所记录的资讯更为详尽和完备。
什么是GPS?
GPS,Global Positioning System(全球卫星定位系统),是美国从20世纪70年代开始耗巨资研制,于1994年全面建成,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。越来越多的数码相机厂商也开始在他们的新产品里提供了GPS功能的支持,(如Kodak DCS760等)可将照片拍摄瞬间所处经度、纬度、海拔的三维空间定位数据记载在图片里,只要图片里保留了完整的GPS信息,IExif就能准确地再现给查看者。
什么是IPTC/NAA?
IPTC-NAA由美国报业协会(NAA)和国际印刷电信委员会(IPTC)制定的信息标准,以识别传输的文本和图像。该标准包括关于题注、关键字、类别、资料来源和原稿的条目等。当前许多新闻图片机器都包含了IPTC/NAA记录。