一.什么是Exif
Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图 等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能 处理 Exif信息。
所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来 标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字 符。
0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全 球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标 准,检索出它们的具体含义,一般而言包括以下一些信息:
Image Description 图像描述、来源. 指生成图像的工具
Artist作者 有些相机可以输入使用者的名字
Make 生产者 指产品生产厂家
Model 型号 指设备型号
Orientation方向 有的相机支持,有的不支持
XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
ResolutionUnit分辨率单位 一般为PPI
Software软件 显示固件Firmware版本
DateTime日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间 即快门速度
FNumber光圈系数
ExposureProgram曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal创建时间
DateTimeDigitized数字化时间
ComponentsConfiguration图像构造(多指色彩组合方案)
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度
ExposureBiasValue曝光补偿。
MaxApertureValue最大光圈
MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。
Lightsource光源 指白平衡设置
Flash是否使用闪光灯。
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
FlashPixVersionFlashPix版本 (个别机型支持)
ColorSpace色域、色彩空间
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数
Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详
FileSource源文件 Compression压缩比。
二.Camera中拍照流程
在Android Camera程序开发过程中,要用到Exif相关的知识,如果处理不当,会导致拍摄的JPEG图片无法正常浏览。
在Froyo(Android 2.2)源码中的Camera应用是不对Exif信息进行写操作,而只是读操作,对于Exif的写操作是交给Camera硬件抽象层去完成,这是 google的设计逻辑。但是不同的Android平台及其相关子平台,再加上不同的Camera应用,相互交替,排列组合,或许会出现这样一种情况:底 层没有去写Exif,而上层应用也没有写Exif信息,那么图片的显示信息将会丢失。其中影响最为严重的是Orientation这个参数。
Froyo camera的逻辑是这样的:
在Camera这个Activity中,有一个内部类ImageCapture,其中包含一个重要的方法:
private void capture() {
// Set rotation.
mParameters.setRotation(mLastOrientation);
....................
.....................
mCameraDevice.setParameters(mParameters);
mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback, mPostViewPictureCallback, new JpegPictureCallback(loc));
}
大致流程是这样的:
1.将拍照时相机的方向添加进Camera.Parameters的实例中;
2.将全部相机拍照参数传给android.hardware.Camera的对象;
3.调用方法takePicture,并设置好非常重要的4个callback;
4.生成Exif数据的事情就由HAL来完成;
5.第4个callback返回数据(这个callback是最重要的,而且是不可缺省的,也就是说前3个callback设置成Null也不会影响拍照功能),见如下代码:
private final class JpegPictureCallback implements PictureCallback {
public void onPictureTaken(final byte[] jpegData, final android.hardware.Camera camera) {
//jpegData为JPEG数据,是由HAL层根据应用传输的各种参数(即Camera.Parameters的实例)以及JPEG压缩算法生成的。
mImageCapture.storeImage(jpegData, camera, mLocation);
}
}
三.Exif使用方法及代码优化方案
什么地方用到Exif信息呢?我遇到的至少有如下这么几个地方:
1.生成右上角所略图;
2.图片显示应用,例如android自带的gallery3d应用;
3.图片回显;
4.短(彩)信等需要添加camera附件的应用.
看看源码: ImageManager中是这样读取Exif方向参数的。
public static int getExifOrientation(String filepath) {
int degree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(filepath);
} catch (IOException ex) {
Log.e(TAG, "cannot read exif", ex);
}
if (exif != null) {
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, -1);
if (orientation != -1) {
// We only recognize a subset of orientation tag values.
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
}
}
return degree;
}
这个方法可以进一步优化,从而对于Exif信息的写入不再依赖底层。那就是比较一下传输给底层的orientation与实际返回的是否相等,不相等就是底层写入Exif信息出错,我们就可以在应用层进行修正。
可以添加一个判断分支如下:(其中EXIF_ORIENTATION是我们缓存的应用传给底层的值)。
else if(orientation == 0 && EXIF_ORIENTATION != 0) {
switch (EXIF_ORIENTATION) {
case 90:
orientation = ExifInterface.ORIENTATION_ROTATE_90;
degree = 90;
break;
case 180:
orientation = ExifInterface.ORIENTATION_ROTATE_180;
degree = 180;
break;
case 270:
orientation = ExifInterface.ORIENTATION_ROTATE_270;
degree = 270;
break;
}
exif.setAttribute(ExifInterface.TAG_ORIENTATION, Integer.toString(orientation));
try {
exif.saveAttributes();
} catch (IOException e) {
Log.e(TAG, "cannot save exif", e);
}
}
在应用层对于Exif的操作是通过android.media.ExifInterface接口完成的。
通过public void setAttribute (String tag, String value) 来设置,而获取可以通过 public int getAttributeInt (String tag, int defaultValue) 和 public String getAttribute (String tag) 两种方法都可以,getAttributeInt 重载方法一第二个参数为我们设置的默认值,如果成功则返回相应Tag的值;特定的整数内容为该方法直接返回值。而重载方法二该方法直接返回结果,如果失败 则为null。
结论
这样,经过简单改造(只是添加了对Exif信息校验以及写操作的逻辑)的Camera应用将更加健壮,不依赖平台底层是否处理了Exif信息,即使出现异常,应用能够自动修正。
这里只是以Exif中的 Orientation参数为例,其他参数可以以此类推,保证拍摄出来的图片符合标准。
转自:http://blog.csdn.net/zoe6553/article/details/6297409
学习JPEG文件格式过程中看到的高质量博文, 转载过来, 谢谢博主 [lsiyun的专栏]
大概翻译了一下,非常的粗糙,慢慢修正。请高手自动飘过~
因为做图像压缩时会损失相机写入的如光圈、快门等信息,所以自己写了个图像压缩小玩意,顺便研究了一下Exif。
原文地址:Exif file format
JPEG格式和标志
JPEG文件都是以十六进制 '0xFFD8'开始,以'0xFFD9'结束。在JPEG数据中有像'0xFF**'这样的数据,这些被称为“标志”,它表示JPEG信息数据段。0xFFD8 表示SOI(Start of image 图像开始),0xFFD9表示EOI(End of image 图像结束)。这两个特殊的标志没有附加的数据,而其他的标志在标志后都带有附加的数据。基本的标志格式如下:
0xFF + 标志数字(1字节) + 数据大小(2字节) + 数据(n字节)
数据大小 (2字节) 是大端顺序表示(Motorola方式),从高字节开始。请注意“数据”包含了数据大小的描述,如果一个标志为:
FF C1 00 0C
则表示标志0xFFC1有0x000C(十进制12)个字节的数据,但是数据的大小 '12' 也包含了记录“数据大小”的字节,所以在0x000C 后面只有10个字节的数据量。
在JPEG格式中,一些标志描绘数据后,跟着的就是SOS(Start of stream 数据流开始)标志。在SOS标志之后,就是JPEG图像流,直到EOI标志终结。
SOI Marker |
Marker XX size=SSSS |
Marker YY size=TTTT |
SOS Marker size=UUUU |
Image stream |
EOI Marker |
||||||
FFD8 |
FFXX |
SSSS |
DDDD...... |
FFYY |
TTTT |
DDDD...... |
FFDA |
UUUU |
DDDD.... |
I I I I.... |
FFD9 |
Exif中使用的标志
从0xFFE0 ~ 0xFFEF 的标志是“应用程序标志”,在解码JPEG 图像的时候不是必需使用的。这些标志被用在用户应用中。例如:老款的Olympus(奥林巴斯)、canon(佳能)、casio(卡西欧)、Agfa(爱克发)的数码相机使用JFIF(JPEG档案交换格式)来存储相片的。JFIF使用APP0(0xFFE0)标志来插入数码相机的配置数据和缩略图的。
Exif也使用应用程序标志来插入数据,但是Exif使用APP1(0xFFE1)标志以避免和JFIF格式冲突。每个Exif文件格式都是从下面格式开始的:
SOI Marker |
APP1 Marker |
APP1 Data |
Other Marker |
FFD8 |
FFE1 |
SSSS 457869660000 TTTT...... |
FFXX SSSS DDDD...... |
从SOI(0xFFD8)标志开始,所以这是一个JPEG文件。后面随即跟着个一个APP1标志。所有的Exif数据都储存在APP1数据区中。在上表中的 "SSSS" 部分表示APP1数据(Exif 数据区域)的大小。请注意其大小"SSSS"包括大小描述"SSSS"其本身。
APP1的数据从"SSSS"后开始。第一部分是特殊数据,使用ASCII字符"Exif"和两个字节的 0x00 ,它定义了是否使用Exif。
APP1标志数据之后,是其他JPEG标志。
Exif数据结构
大略的Exif数据结构(APP1)如下。它采用了"Intel"的小端字节顺序方案,且包含JPEG格式的缩略图。总体上,Exif数据是从ASCII字符"Exif"和2个字节的0x00开始,后面就是Exif的数据了。Exif使用TIFF格式来存储数据。想知道更多关于TIFF格式内容,请浏览"TIFF6.0 specification"。
FFE1 |
APP1 Marker |
||||
SSSS |
APP1 Data |
APP1 Data Size |
|||
45786966 0000 |
Exif Header |
||||
49492A00 08000000 |
TIFF Header |
||||
XXXX. . . . |
IFD0 (main image) |
Directory |
|||
LLLLLLLL |
Link to IFD1 |
||||
XXXX. . . . |
Data area of IFD0 |
||||
XXXX. . . . |
|
Exif SubIFD |
Directory |
||
00000000 |
End of Link |
||||
XXXX. . . . |
Data area of Exif SubIFD |
||||
XXXX. . . . |
|
Interoperability IFD |
Directory |
||
00000000 |
End of Link |
||||
XXXX. . . . |
Data area of Interoperability IFD |
||||
XXXX. . . . |
Makernote IFD |
Directory |
|||
00000000 |
End of Link |
||||
XXXX. . . . |
Data area of Makernote IFD |
||||
XXXX. . . . |
IFD1(thumbnail image) |
Directory |
|||
00000000 |
End of Link |
||||
XXXX. . . . |
Data area of IFD1 |
||||
FFD8XXXX. . . XXXXFFD9 |
Thumbnail image |
TIFF头的格式
TIFF头指的是TIFF格式的前8个字节。前两个字节定义了TIFF数据采用何种字节顺序。如果是0x4949 = "II",表示采用"Intel"的小端字节顺序,如果为0x4d4d = ''MM",表示采用"Motorola"的大端字节顺序。例如:值'305,419,896'用十六进制表示为0x12345678.在Motorola的大端字节顺序中以0x12,0x34,0x56,0x78的顺序存储。如果采用Intel的小端字节顺序,则以0x78,0x56,0x34,0x12的顺序存储。现在来看,大多数数码相机采用Intel的方式。Ricoh(理光)采用了Motorola的方式。Sony(索尼)除了D700都采用Intel的的字节顺序。Kodak(柯达)DC200/210/240采用Motorola方式,但是DC220/260使用PowerPC却采用了Intel的方式!因此我们在获取Exif数据时,必须每次都确认它的字节顺序。虽然JPEG数据只采用Motorola方式的字节顺序,但Exif却允许采用两种方式。我不明白为什么Exif不修改字节顺序为Motorola方式。
然后的两个字节总是2个字节长度的0x002A。如果数据采用Intel的字节顺序,这两个字节为"0x2A,0x00"。如果采用Motorola的字节顺序,则为"0x00,0x2A"。TIFF头的最后4个字节是第一个IFD(Image File Directory, described in next chapter 图像文件目录,描述下一个字符)的偏移量。在TIFF格式中所有的偏移量都是从TIFF头的第一个字节("II"或者"MM")开始计算的到所在位置的字节数目,这个偏移量也不例外。通常第一个IFD是紧跟在TIFF头后面的,所以它的偏移量为'0x00000008'。
Byte align |
TAG Mark |
Offset to first IFD |
"I I" or "MM" |
0x002a |
0x00000008 |
IFD:图像文件目录(Image file directory )
接着TIFF头的是第一个IFD。它包含了图像信息数据。在下表中,开始的两个字节('EEEE')表示这个IFD所包含的目录实体数量。然后紧跟着就是实体对象(每个实体12个字节)。在最后一个目录实体后面有一个4字节大小的数据(表中的是'LLLLLLLL'),它表示下一个IFD的偏移量。如果这个偏移量的值是'0x00000000',就表示这个IFD是最后一个IFD。
EEEE |
No. of directory entry |
|||
TTTT |
ffff |
NNNNNNNN |
DDDDDDDD |
Entry 0 |
TTTT |
ffff |
NNNNNNNN |
DDDDDDDD |
Entry 1 |
. . . . . . . . . |
. . . . . . |
|||
TTTT |
ffff |
NNNNNNNN |
DDDDDDDD |
Entry EEEE-1 |
LLLLLLLL |
Offset to next IFD |
上表中的'TTTT'(2字节)是标签号,代表各种数据。'ffff'(2字节)是数据格式。'NNNNNNNN'(4字节)是组成元素的数量。'DDDDDDDD'(4字节) 包含数据本身或者数据的偏移量。
数据格式
数据格式(上表中的'FFFF')如下表所定义的一样。"rational"表示一个分数,它包含两个signed/unsigned long integer值并且第一个为分子,第二个为分母。
Value |
1 |
2 |
3 |
4 |
5 |
6 |
Format |
unsigned byte |
ascii strings |
unsigned short |
unsigned long |
unsigned rational |
signed byte |
Bytes/component |
1 |
1 |
2 |
4 |
8 |
1 |
Value |
7 |
8 |
9 |
10 |
11 |
12 |
Format |
undefined |
signed short |
signed long |
signed rational |
single float |
double float |
Bytes/component |
1 |
2 |
4 |
8 |
4 |
8 |
你可以用组成元素的字节数('bytes/components')的值(见上表)乘以储存在'NNNNNNNN'区域中的组成元素的数量得到数据总长度。如果这个总长度小于4个字节,那么'DDDDDDDD'中的是这个标签(Tag)的值。如果总长度大于等于4个字节,'DDDDDDDD'中的是数据存储地址的偏移量。
IFD数据结构
在Exif格式中,第一个IFD是IFD0(主图像的IFD),它链接着IFD1(缩略图的IFD)后IFD链终止。带式IFD0/IFD1不包含像快门速度,焦距等任何数码相机的信息。IFD0总是包含特殊的标签(Tag)Exif的偏移量(0x8769) ,它说明道Exif SubIFD(子IFD)的偏移量。Exif SubIFD(子IFD)也是IFD的格式,它包含了数码相机的信息。、
Exif格式的扩展方案(Exif2.1/DCF)中,Exif SubIFD 包含了特殊标签 Exif互用偏移量(Exif Interoperability Offset)(0xA005)。它指向互用的IFD(Interoperability IFD)。在DCF(数码相机格式)规范中,这个标签是必须的且子IFD(SubIFD(主图像IFD))和IFD1(缩略图IFD)都可以带使用互用的IFD(Interoperability IFD)。通常,只有主图像使用带有这个标签。
一些数码相机使用IFD数据格式来表示制造商数据——制造商特殊的神秘数字区。要小心的编写程序,因为很难区分制造商数据是否使用了IFD格式。附录中有一些制造商数据的信息。
0000: 49 49 2A 00 08 00 00 00-02 00 1A 01 05 00 01 00
0010: 00 00 26 00 00 00 69 87-04 00 01 00 00 00 11 02
0020: 00 00 40 00 00 00 48 00-00 00 01 00 00 00
如果上面数据为TIFF数据的第一个部分,那么可以解释为:
头两个字节为"II",是'Intel'的字节顺序;
地址0x0004~0x0007是 is 0x08000000,IFD0从地址'0x0008'开始;
地址 0x0008~0x0009 是 0x0200,吗,IFD0有2个目录实体;
地址 0x000a~0x000b 是 0x1A01, 表示这是一个水平分辨率(XResolution)(0x011A)标签,它包含了图像的水平分辨率;
地址 0x000c~0x000d 是 0x0500,,这个值表示的格式是无符号分数(unsigned rational)(0x0005);
地址 0x000e~0x0011 是 0x01000000,,组成元素数量是'1',无符号分数(unsigned rational)的尺寸是8字节,所有数据总长度为 1 ×8 = 8字节;
数据总长度大于4个字节,所以接下的4个字节是数据的偏移量;
地址0x0012~0x0015 是 0x26000000,水平分辨率(XResolution)的数据存储在0x0026;
地址0x0026~0x0029 是 0x48000000,分子是72,地址0x002a~0x002d是0x0100000000,分母是 '1'。所以水平分辨率(XResolution)是72/1;
地址0x0016~0x0017是0x6987,下一个标签是Exif偏移(ExifOffset)(0x8769)。它的值是Exif子IFD(Exif SubIFD)的偏移量;
数据格式是0x0004,无符号长整型(unsigned long integer);
这个标签有一个元素。无符号长整型(unsigned long integer)长度为4个字节,所以数据总长度为4字节;
总数据长度等于4字节,接下的4个字节是Exif子IFD(Exif SubIFD)的偏移量;
地址0x001e~0x0021是0x11020000,Exif子IFD(Exif SubIFD)从'0x0211'开始;
这是最后一个目录实体,接下的4个字节表示下一个IFD的偏移量;
地址0x0022~0x0025 是 0x40000000,下一个IFD从'0x0040'开始。
缩略图
Exif格式包含图像的缩略图(除了Ricoh (理光)RDC-300Z)。缩略图通常在IFD1后面。共有3种格式的缩略图:JPEG格式(JPEG 使用YCbCr),RGB TIFF格式,YcbCr TIFF 格式。现在Exif 2.1 或者更高版本是推荐使用JPEG格式和160×120的缩略图。而DCF规范则必须使用JPEG格式和160×120的缩略图。
JPEG格式缩略图
如果IFD1中压缩(Compression)(0x0103)标签的值为 '6 ',那么缩略图是JPEG格式。大多数的Exif图像使用JPEG格式的缩略图。在这些图像中,你可以在IFD1中JpegIFOffset(0x0201)标签中,以及JpegIFByteCount(0x0202)标签中分别获得缩略图的偏移量和大小。其数据格式为普通的JPEG格式,从0xFFD8 开始,到 0xFFD9结束。
TIFF格式缩略图
如果IFD1中压缩(Compression)(0x0103)标签的值为 '1 ',那么说缩略图是非压缩的(TIFF格式)。缩略图的起点数据在StripOffset(0x0111)标签,缩略图大小则是StripByteCounts(0x0117)标签的和。
如果缩略图是无压缩的且IFD1中标签PhotometricInterpretation(0x0106)的值为'2',则缩略图采用RGB格式。在这种情况中,你可以通过那数据复制到计算机中RGB格式(如BMP格式,或者复制到VRAM目录)等简单方法查看缩略图。Kodak(柯达)DC -210/220/260 就是使用这种格式。需要说明的是,TIFF用'RGB'的顺序储存像素数据,而BMP格式采用BGR顺序。
如果标签值为'2',那么缩略图采用YcbCr格式。如果你想查看缩略图,你必须要把它转换为RGB。Ricoh(理光)RDC4200/4300, Fuji(富士) DS-7/300 and DX-5/7/9 都是用这种格式(比较新的RDC5000/MX-X00系列使用JPEG格式)。Next section is brief description to conversion of Fuji DS's thumbnail. For more details, refer to TIFF6.0 specification.
At DX-5/7/9, YCbCrSubsampling(0x0212) has values of '2,1', PlanarConfiguration(0x011c) has a value '1'. So the data align of this image is below.
Y(0,0),Y(1,0),Cb(0,0),Cr(0,0), Y(2,0),Y(3,0),Cb(2,0),Cr(3.0), Y(4,0),Y(5,0),Cb(4,0),Cr(4,0). . . .
The numeric in parenthesis is pixel coordinates. DX series' YCbCrCoefficients(0x0211) has values '0.299/0.587/0.114', ReferenceBlackWhite(0x0214) has values '0,255,128,255,128,255'. Therefore to convert from Y/Cb/Cr to RGB is;
B(0,0)=(Cb-128)*(2-0.114*2)+Y(0,0)
R(0,0)=(Cr-128)*(2-0.299*2)+Y(0,0)
G(0,0)=(Y(0,0)-0.114*B(0,0)-0.299*R(0,0))/0.587
Horizontal subsampling is a value '2', so you can calculate B(1,0)/R(1,0)/G(1,0) by using the Y(1,0) and Cr(0,0)/Cb(0,0). Repeat this conversion by value of ImageWidth(0x0100) and ImageLength(0x0101).
Exif/TIFF 中使用的标签号
Exif/TIFF 中使用的标签号如下所示。如果标签的元素数量有限制,则CompoNo列就是最大允许的元素个数,如果CompoNo列为空,代表没有限制。
IFD0 中使用的标签(主图像) |
|||||||||||||||||||||||||||||||
Tag No. |
标签名称 |
格式 |
CompoNo |
Desc. |
|||||||||||||||||||||||||||
0x010e |
ImageDescription (图像描述) |
ascii string |
描述相片,不支持双字节的字符,如汉语、韩语、日语 |
||||||||||||||||||||||||||||
0x010f |
Make (制造商) |
ascii string |
数码相机制造商。在Exif标准中是可选的,但在DCF(数码相机格式)中是必需的。 |
||||||||||||||||||||||||||||
0x0110 |
Model (型号) |
ascii string |
数码相机型号。在Exif标准中是可选的,但在DCF(数码相机格式)中是必需的。 |
||||||||||||||||||||||||||||
0x0112 |
Orientation (方向) |
unsigned short |
1 |
The orientation of the camera relative to the scene, when the image was captured. The relation of the '0th row' and '0th column' to visual position is shown as right. 拍摄时的相机方向(横向还是纵向,那边朝上)。…… |
|||||||||||||||||||||||||||
0x011a |
Xresolution (水平分辨率) |
unsigned rational |
1 |
图像显示、打印的分辨率。默认值值是每英寸72像素,但是因为个人计算机不使用这个值来显示或者打印,所以这个值没有意义。 |
|||||||||||||||||||||||||||
0x011b |
Yresolution (垂直分辨率) |
unsigned rational |
1 |
||||||||||||||||||||||||||||
0x0128 |
ResolutionUnit (分辨率单位) |
unsigned short |
1 |
水平或者垂直分辨率XResolution(0x011a)/YResolution(0x011b)的单位,'1''表示没有单位,'2'表示英寸,'3'表示厘米。默认为'2'。 |
|||||||||||||||||||||||||||
0x0131 |
Software (软件) |
ascii string |
Shows firmware(internal software of digicam) version number. 固件(数码相机内软件)版本号。 |
||||||||||||||||||||||||||||
0x0132 |
DateTime (日期时间) |
ascii string |
20 |
图像最后修改的日期时间。日期格式为"YYYY:MM:DD HH:MM:SS" + 0x00,一共20字节。如果没有设置时钟或者数码相机没有时钟,这个区域可填充空格。通常,这个标签的值与DateTimeOriginal(0x9003)的值相同。 |
|||||||||||||||||||||||||||
0x013e |
WhitePoint (白点) |
unsigned rational |
2 |
定义了图像白点的色度。如果图像使用CIE(国际照明委员会)标准亮度D65(被认为是‘阳光’的标准)的光源,这个值为'3127/10000,3290/10000'。 |
|||||||||||||||||||||||||||
0x013f |
PrimaryChromaticities (原色色度) |
unsigned rational |
6 |
定义了原色的色度。如果图像使用CCIR推荐709原色方案,这个值应该为'640/1000,330/1000,300/1000,600/1000,150/1000,0/1000'。 |
|||||||||||||||||||||||||||
0x0211 |
(颜色空间转换矩阵系数) |
unsigned rational |
3 |
当图像格式为YcbCr时,这个值包含一个与RGB格式转换的常量参数。通常,这个值为'0.299/0.587/0.114'。 |
|||||||||||||||||||||||||||
0x0213 |
YcbCrPositioning (YcbCr配置) |
unsigned short |
1 |
When image format is YCbCr and uses 'Subsampling'(cropping of chroma data, all the digicam do that), defines the chroma sample point of subsampling pixel array. '1' means the center of pixel array, '2' means the datum point. 当图像格式为YCbCr且使用部分采样(色度数据的取样,所有数码相机都会这么做)时,定义了部分抽样像素数组的色度样本点。'1'表示像素数组的中间,'2'表示基准点。 |
|||||||||||||||||||||||||||
0x0214 |
ReferenceBlackWhite (黑白参照值对) |
unsigned rational |
6 |
Shows reference value of black point/white point. In case of YCbCr format, first 2 show black/white of Y, next 2 are Cb, last 2 are Cr. In case of RGB format, first 2 show black/white of R, next 2 are G, last 2 are B. 黑白点参照值。在YcbCr格式的方案中,头2字节表示Y的黑白参照值,接下来的2字节是Cb的,最后2字节是Cr的。在RGB格式方案中,头2字节表示R的黑白参照值,接下来的2字节是G的,最后2字节是B的。 |
|||||||||||||||||||||||||||
0x8298 |
Copyright (版权) |
ascii string |
Shows copyright information 版权信息 |
||||||||||||||||||||||||||||
0x8769 |
ExifOffset |
unsigned long |
1 |
Offset to Exif Sub IFD 子IFD的偏移量 |
互用(Interoperability) IFD中使用的标签 |
||||
Tag No. |
标签名称 |
格式 |
CompoNo |
Desc. |
0x0001 |
InteroperabilityIndex (互用索引) |
Ascii string |
4 |
If this IFD is main image's IFD and the file content is equivalent to ExifR98 v1.0, the value is "R98". If thumbnail image's, value is "THM". 如果这个IFD是主图像的IFD且文件内容与EixfR98 V1.0相当,那么值为"R98"。如果是缩略图的IFD,值为"THM"。 |
0x0002 |
InteroperabilityVersion (互用版本) |
Undefined |
4 |
Records the interoperability version. "0100" means version 1.00. 记录互用版本。"0100"表示V1.00。 |
0x1000 |
RelatedImageFileFormat (图像文件格式) |
Ascii string |
any |
Records the file format of image file. Value is ascii string (e.g. "Exif JPEG Ver. 2.1"). 记录图像的文件格式。值为ASCII字符串 (例如:"Exif JPEG Ver.2.1") |
0x1001 |
RelatedImageWidth (图像宽度) |
Short or Long |
1 |
Records the image size. 图像尺寸 |
0x1001 |
RelatedImageLength (图像高度) |
Short or Long |
1 |
IFD1 (缩略图)中使用的标签 |
||||
Tag No. |
标签名称 |
格式 |
CompoNo |
Desc. |
0x0100 |
ImageWidth (图像宽度) |
unsigned short/long |
1 |
Shows size of thumbnail image. 缩略图的尺寸 |
0x0101 |
ImageLength (图像高度) |
unsigned short/long |
1 |
|
0x0102 |
BitsPerSample (分量位数) |
unsigned short |
3 |
When image format is no compression, this value shows the number of bits per component for each pixel. Usually this value is '8,8,8' 当图像采用未压缩的格式时,这个值表示每个分量用几个字节表示。通常这个值为'8,8,8'。 |
0x0103 |
Compression (压缩) |
unsigned short |
1 |
Shows compression method. '1' means no compression, '6' means JPEG compression. 压缩方法。1、不压缩;6、JPEG压缩。 |
0x0106 |
PhotometricInterpretation (色彩空间) |
unsigned short |
1 |
Shows the color space of the image data components. '1' means monochrome, '2' means RGB, '6' means YCbCr. 图像的色彩空。1、黑白;2、RGB;6、YcbCr。 |
0x0111 |
StripOffsets |
unsigned short/long |
When image format is no compression, this value shows offset to image data. In some case image data is striped and this value is plural. 当图像为非压缩格式时,这个值表示图像数据的偏移量。在一些时候,图像数据是带状存储的,这个值不止一个。 |
|
0x0115 |
SamplesPerPixel (每像素分量) |
unsigned short |
1 |
When image format is no compression, this value shows the number of components stored for each pixel. At color image, this value is '3'. 当图像采用未压缩格式的时候,这个值表示每个像素中的分量个数。彩色图像的值为3。 |
0x0116 |
RowsPerStrip |
unsigned short/long |
1 |
When image format is no compression and image has stored as strip, this value shows how many rows stored to each strip. If image has not striped, this value is the same as ImageLength(0x0101). 当图像格式是非压缩的且图像带状存储,这个值就表示每带存储多少行。如果图像不是带状存储的,这个值等于图像高度ImageLength(0x0101)。 |
0x0117 |
StripByteConunts |
unsigned short/long |
When image format is no compression and stored as strip, this value shows how many bytes used for each strip and this value is plural. If image has not stripped, this value is single and means whole data size of image. 当图像未压缩并以带状存储时,这个值表示每带有多少直接且此值不止一个。如果图像不是带状存储,这个值只有一个且表示整个图像的尺寸。 |
|
0x011a |
Xresolution (水平分辨率) |
unsigned rational |
1 |
Display/Print resolution of image. Large number of digicam uses 1/72inch, but it has no mean because personal computer doesn't use this value to display/print out. 图像显示或者打印的分辨率。大部分数码相机为1/72英寸,但是因为计算年不按这个值来答应和显示图像,所以此值没有意义。 |
0x011b |
Yresolution (垂直分辨率) |
unsigned rational |
1 |
|
0x011c |
PlanarConfiguration (平面配置) |
unsigned short |
1 |
When image format is no compression YCbCr, this value shows byte aligns of YCbCr data. If value is '1', Y/Cb/Cr value is chunky format, contiguous for each subsampling pixel. If value is '2', Y/Cb/Cr value is separated and stored to Y plane/Cb plane/Cr plane format. 当图像格式是不压缩的YcbCr时,这个值表示YcbCr数据的排列顺序。1表示Y/Cb/Cr是紧凑格式,一像素数据相连。2表示Y/Cb/Cr值分开存储,以Y平面、Cb平面、Cr平面存储。 |
0x0128 |
ResolutionUnit (分辨率单位) |
unsigned short |
1 |
Unit of XResolution(0x011a)/YResolution(0x011b). '1' means inch, '2' means centimeter. 分辨率(XResolution(0x011a)/YResolution(0x011b))的单位。1、英寸;2、厘米。 |
0x0201 |
JpegIFOffset (Jpeg偏移量) |
unsigned long |
1 |
When image format is JPEG, this value show offset to JPEG data stored. 当图像格式为JPEG时的JPEG数据偏移量。 |
0x0202 |
JpegIFByteCount (Jpeg数据字节数) |
unsigned long |
1 |
When image format is JPEG, this value shows data size of JPEG image. 当图像格式为JPEG时,这个值表示JPEG图像数据有多少个字节。 |
0x0211 |
YcbCrCoefficients (YcbCr系数) |
unsigned rational |
3 |
When image format is YCbCr, this value shows constants to translate it to RGB format. In usual, '0.299/0.587/0.114' are used. 当图像为YcbCr格式时,这个值表示转换为RGB时的常量参数。通常这个值为'0.299/0.587/0.114'。 |
0x0212 |
YcbCrSubSampling (YcbCr子抽样) |
unsigned short |
2 |
When image format is YCbCr and uses subsampling(cropping of chroma data, all the digicam do that), this value shows how many chroma data subsampled. First value shows horizontal, next value shows vertical subsample rate. 当图像为YcbCr格式且二次抽样(裁剪色度数据,所有的数码相机都这么做)时,这个值表示有多少色度信息被二次抽样。第一个值是水平方向的、第二个值是垂直方向的抽样率。 |
0x0213 |
YcbCrPositioning (YCbCr抽象点) |
unsigned short |
1 |
When image format is YCbCr and uses 'Subsampling'(cropping of chroma data, all the digicam do that), this value defines the chroma sample point of subsampled pixel array. '1' means the center of pixel array, '2' means the datum point(0,0). 当图像为YcbCr格式且二次抽样(裁剪色度数据,所有的数码相机都这么做)时,这个值定义了子抽样中的色度样本点在像素数组中的位置。1、像素数组中心;2、基准点(0,0)。 |
0x0214 |
ReferenceBlackWhite (黑白参照值对) |
unsigned rational |
6 |
Shows reference value of black point/white point. In case of YCbCr format, first 2 show black/white of Y, next 2 are Cb, last 2 are Cr. In case of RGB format, first 2 show black/white of R, next 2 are G, last 2 are B. 黑白点参照值。在YcbCr格式的方案中,头2字节表示Y的黑白参照值,接下来的2字节是Cb的,最后2字节是Cr的。在RGB格式方案中,头2字节表示R的黑白参照值,接下来的2字节是G的,最后2字节是B的。 |
Misc Tags |
||||
Tag No. |
Tag Name |
Format |
CompoNo |
Desc. |
0x00fe |
NewSubfileType |
unsigned long |
1 |
|
0x00ff |
SubfileType |
unsigned short |
1 |
|
0x012d |
TransferFunction |
unsigned short |
3 |
|
0x013b |
Artist (艺术家) |
ascii string |
||
0x013d |
Predictor |
unsigned short |
1 |
|
0x0142 |
TileWidth |
unsigned short |
1 |
|
0x0143 |
TileLength |
unsigned short |
1 |
|
0x0144 |
TileOffsets |
unsigned long |
||
0x0145 |
TileByteCounts |
unsigned short |
||
0x014a |
SubIFDs |
unsigned long |
||
0x015b |
JPEGTables |
undefined |
||
0x828d |
CFARepeatPatternDim |
unsigned short |
2 |
|
0x828e |
CFAPattern |
unsigned byte |
||
0x828f |
BatteryLevel |
unsigned rational |
1 |
|
0x83bb |
IPTC/NAA |
unsigned long |
||
0x8773 |
InterColorProfile |
undefined |
||
0x8824 |
SpectralSensitivity |
ascii string |
||
0x8825 |
GPSInfo |
unsigned long |
1 |
|
0x8828 |
OECF |
undefined |
||
0x8829 |
Interlace |
unsigned short |
1 |
|
0x882a |
TimeZoneOffset |
signed short |
1 |
|
0x882b |
SelfTimerMode |
unsigned short |
1 |
|
0x920b |
FlashEnergy |
unsigned rational |
1 |
|
0x920c |
SpatialFrequencyResponse |
undefined |
||
0x920d |
Noise |
undefined |
||
0x9211 |
ImageNumber |
unsigned long |
1 |
|
0x9212 |
SecurityClassification |
ascii string |
1 |
|
0x9213 |
ImageHistory |
ascii string |
||
0x9214 |
SubjectLocation |
unsigned short |
4 |
|
0x9215 |
ExposureIndex |
unsigned rational |
1 |
|
0x9216 |
TIFF/EPStandardID |
unsigned byte |
4 |
|
0xa20b |
FlashEnergy |
unsigned rational |
1 |
|
0xa20c |
SpatialFrequencyResponse |
unsigned short |
1 |
|
0xa214 |
SubjectLocation |
unsigned short |
1 |