Android 下的EXIF

摘要:
II相机中的摄影过程在Android相机程序的开发过程中,应使用Exif相关知识。如果处理不当,拍摄的JPEG图片将无法正常浏览。Froyo源代码中的Camera应用程序不写入Exif信息,只读取它。Exif的编写留给了相机硬件抽象层,这是谷歌的设计逻辑。然而,不同的Android平台及其相关子平台,以及不同的相机应用程序,彼此交替、排列和组合。也许会出现这样的情况:底层不写Exif,上层不写Exif信息,那么图像显示信息就会丢失。

一.什么是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的专栏]

原文链接  

目录(?)[-]

  1. JPEG格式和标志
    1. Exif中使用的标志
    2. Exif数据结构
      1. TIFF头的格式
      2. IFD图像文件目录Image file directory
      3. 数据格式
      4. IFD数据结构
    3. 缩略图
      1. JPEG格式缩略图
      2. TIFF格式缩略图
    4. ExifTIFF 中使用的标签号

大概翻译了一下,非常的粗糙,慢慢修正。请高手自动飘过~

因为做图像压缩时会损失相机写入的如光圈、快门等信息,所以自己写了个图像压缩小玩意,顺便研究了一下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

Value

0th Row

0th Column

1

top

left side

2

top

right side

3

bottom

right side

4

bottom

left side

5

left side

top

6

right side

top

7

right side

bottom

8

left side

bottom

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

YcbCrCoefficients

(颜色空间转换矩阵系数)

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的偏移量

Exif SubIFD(子标签)中使用的标签

Tag No.

标签名称

格式

CompoNo

Desc.

0x829a

ExposureTime

(曝光时间)

unsigned rational

1

曝光时间(快门速度的倒数)。以秒为单位。

0x829d

Fnumber

(焦距)

unsigned rational

1

获取图像使用的焦距(光圈)。

0x8822

ExposureProgram

(曝光方式)

unsigned short

1

Exposure program that the camera used when image was taken. '1' means manual control, '2' program normal, '3' aperture priority, '4' shutter priority, '5' program creative (slow program), '6' program action(high-speed program), '7' portrait mode, '8' landscape mode.

拍摄图像时相机的曝光程序(曝光方式)。'1'表示手动控制;'2' '3'光圈优先; '4'快门优先;'5''6''7''8

0x8827

ISOSpeedRatings

(ISO)

unsigned short

2

CCD sensitivity equivalent to Ag-Hr film speedrate.

0x9000

ExifVersion

(Exif版本)

undefined

4

Exif version number. Stored as 4bytes of ASCII character. If the picture is based on Exif V2.1, value is "0210". Since the type is 'undefined', there is no NULL(0x00) for termination.

Exif版本号。用4字节的ASCII字符保存。如果图像基于Exif v2.1,其值为"0210"。由于类型为‘未定义’,所以结尾没有NULL(0x00)值。

0x9003

DateTimeOriginal

(原始图像采集的时间)

ascii string

20

原始图像采集时的时间。这个值不能被用户的程序修改。时间格式为"YYYY:MM:DD HH:MM:SS" + 0x00,共20字节。如果没有设定时钟或者数码相机没有时钟,这个区域可填充空格。在Exif标准中,这个标签是可选的,但在DCF标准中时必须的。

通常,这个标签的值与DateTimeOriginal(0x0132)的值相同。

0x9004

DateTimeDigitized

(原始图像被数字化编码时的时间)

ascii string

20

图像被数字化的时间。通常和DateTimeOriginal(原始图像采集的时间)(0x9003)相同。时间格式为"YYYY:MM:DD HH:MM:SS" + 0x00,共20字节。如果没有设定时钟或者数码相机没有时钟,这个区域可填充空格。在Exif标准中,这个标签是可选的,但在DCF标准中时必须的。

0x9101

ComponentsConfiguration

(像素颜色构成顺序)

undefined

Shows the order of pixel data. Most of case '0x04,0x05,0x06,0x00' is used for RGB-format and '0x01,0x02,0x03,0x00' for YCbCr-format. 0x00:does not exist, 0x01:Y, 0x02:Cb, 0x03:Cr, 0x04:Red, 0x05:Green, 0x06:Bllue.

像素数据种色彩的顺序。大多数都采用RGB格式为'0x04,0x05,0x06,0x00',YcbCr格式为'0x01,0x02,0x03,0x00'的方案。0x00:不存在;0x01: Y; 0x02: Cb; 0x03: Cr; 0x04: Red,;0x05: Green; 0x06: Blue.

0x9102

CompressedBitsPerPixel

每个像素的压缩位

unsigned rational

1

The average compression ratio of JPEG (rough estimate).

JPEG的平均压缩率(粗略估计)。

0x9201

ShutterSpeedValue

(快门速度APEX值)

signed rational

1

Shutter speed by APEX value. To convert this value to ordinary 'Shutter Speed'; calculate this value's power of 2, then reciprocal. For example, if the ShutterSpeedValue is '4', shutter speed is 1/(24)=1/16 second.

快门速度的APEX值。要来转化为平常的“快门速度”,计算方法为2的这个值为幂次方,在倒数。举例,如果ShutterSpeedValue(快门速度APEX值)为4则快门速度为1/(24)=1/16 秒。

0x9202

ApertureValue

(光圈)

unsigned rational

1

The actual aperture value of lens when the image was t

获取图像时实际的光圈值。单位是APEX。要转换原始光圈,对 求这个值次幂。举例:如果ApertureValue(光圈)为'5',光圈(F-number(F-stop),)为1.41425 = F5.6。

0x9203

BrightnessValue

(亮度)

signed rational

1

Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv).
Ev=Bv+Sv   Sv=log2(ISOSpeedRating/3.125)
ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.

物体的亮度,单位是APEX。曝光量(EV)等于亮度(BV )加上感光度(SV)。

Ev=Bv+Sv   Sv=log2(ISOSpeedRating/3.125)
ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.

0x9204

ExposureBiasValue

(曝光补偿)

signed rational

1

Exposure bias(compensation) value of taking picture. Unit is APEX(EV).

拍摄时的曝光补偿(EV),单位是APEX(EV)。

0x9205

MaxApertureValue

(最大光圈)

unsigned rational

1

Maximum aperture value of lens. You can convert to F-number by calculating power of root 2 (same process of ApertureValue:0x9202).

镜头的最大光圈。以 为底,这个值为幂,等到的值就是焦距(计算方法同ApertureValue

(光圈)(0x0902)一样)。

0x9206

SubjectDistance

(物距)

signed rational

1

Distance to focus point, unit is meter.

到焦点的距离,单位是米。

0x9207

MeteringMode

测光方式

unsigned short

1

Exposure metering method. '0' means unknown, '1' average, '2' center weighted average, '3' spot, '4' multi-spot, '5' multi-segment, '6' partial, '255' other.

测光方式。0、未知;1、平均测光;2、中心重点平均;3、单点测光;4、多点测光;5、矩阵测光;6、局部测光;255、其他。

0x9208

LightSource

(光源,白平衡)

unsigned short

1

光源,实际表示白平衡设置。0、未知;1、日光;2、荧光灯;3、钨丝灯;10、闪光灯;17、标准光线A;18、标准光线B;19、标准光线C;20、D55;21、D65;22、D75;255、其他。

0x9209

Flash

(闪光)

unsigned short

1

'0' means flash did not fire, '1' flash fired, '5' flash fired but strobe return light not detected, '7' flash fired and strobe return light detected.

0、没有使用闪光灯;1、使用闪光灯;5、闪光但没有检测到;闪光且检测到。

0x920a

FocalLength

(焦距)

unsigned rational

1

Focal length of lens used to take image. Unit is millimeter.

拍摄时焦距,单位为毫米。

0x927c

MakerNote

(制造商标记)

undefined

Maker dependent internal data. Some of maker such as Olympus/Nikon/Sanyo etc. uses IFD format for this area.

制造商内置数据,如奥林巴斯、尼康、三洋等。这区域使用IFD格式

0x9286

UserComment

(用户注释)

undefined

Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji).

储存用户注释。这个标签允许使用双字节字符或Unicode。前8个字节指示字节编码。'JIS'是日本字符编码(日本汉字)。
'0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
'0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
'0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
'0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined

0x9290

SubsecTime

(亚秒时间)

ascii string

Some of digicam can take 2~30 pictures per second, but DateTime/DateTimeOriginal/DateTimeDigitized tag can't record the sub-second time. SubsecTime tag is used to record it.
For example, DateTimeOriginal = "1996:09:01 09:15:30", SubSecTimeOriginal = "130", Combined original time is "1996:09:01 09:15:30.130"

一些数码相机可以在一秒钟内拍摄2~30张相片,但是DateTime(时间)、DateTimeOriginal(采像时间)、DateTimeDigitized(编码时间)标签都无法记录比秒更小的时间。这时可以使用SubsecTime(亚秒时间)标签来记录亚秒时间。

例如:DateTimeOriginal(采像时间) = "1996:09:01 09:15:30",SubSecTimeOriginal(采像亚秒时间) = "130", 合并采像时间后市"1996:09:01 09:15:30.130"。

0x9291

SubsecTimeOriginal

(采像亚秒时间)

ascii string

0x9292

SubsecTimeDigitized

(采像编码时间)

ascii string

0xa000

FlashPixVersion

(FlashPix版本)

undefined

4

Stores FlashPix version. If the image data is based on FlashPix formar Ver.1.0, value is "0100". Since the type is 'undefined', there is no NULL(0x00) for termination.

储存FlashPix版本。如果图像数据是基于FlashPix Ver1.0,那么这个值就是"0100"。由于类型是‘未定义’,所以结尾没有NULL(0x00)。

0xa001

ColorSpace

(色彩空间)

unsigned short

1

Defines Color Space. DCF image must use sRGB color space so value is always '1'. If the picture uses the other color space, value is '65535':Uncalibrated.

定义色彩空间。DCF图像必须使用sRGB色彩空间,其值为'1'。如果图像使用其他色彩空间,其值为'65535':非标准。

0xa002

ExifImageWidth

(图宽)

unsigned short/long

1

Size of main image.

主图像的尺寸。

0xa003

ExifImageHeight

(图高)

unsigned short/long

1

0xa004

RelatedSoundFile

(相关音频文件)

ascii string

If this digicam can record audio data with image, shows name of audio data.

如果数码相机记录了图像的音频数据,音频数据的名称保存在这个标签。

0xa005

ExifInteroperabilityOffset

unsigned long

1

Extension of "ExifR98", detail is unknown. This value is offset to IFD format data. Currently there are 2 directory entries, first one is Tag0x0001, value is "R98", next is Tag0x0002, value is "0100".

"ExifR98"的扩展,细节未知。这个值IFD格式数据的偏移量。目前有两个目录实体,第一个是标签0x0001,值为"R98"。第二个是标签0x0002,值为"0100"。

0xa20e

FocalPlaneXResolutio

(水平分辨率)

unsigned rational

1

Pixel density at CCD's position. If you have MegaPixel digicam and take a picture by lower resolution(e.g.VGA mode), this value is re-sampled by picture resolution. In such case, FocalPlaneResolution is not same as CCD's actual resolution.

CCD上的像素密度。如果一台百兆像素相机使用较低的分辨率(如VGA模式),此值是图像分辨率的重新取样。在一些情况中,FocalPlaneResolution(分辨率)与CCD的实际分辨率不同。

0xa20f

FocalPlaneYResolution

(垂直分辨率)

unsigned rational

1

0xa210

FocalPlaneResolutionUnit

(分辨率单位)

unsigned short

1

Unit of FocalPlaneXResoluton/FocalPlaneYResolution. '1' means no-unit, '2' inch, '3' centimeter. 

Note:Some of Fujifilm's digicam(e.g.FX2700,FX2900,Finepix4700Z/40i etc) uses value '3' so it must be 'centimeter', but it seems that they use a '8.3mm?'(1/3in.?) to their ResolutionUnit. Fuji's BUG? Finepix4900Z has been changed to use value '2' but it doesn't match to actual value also.

 

FocalPlaneXResoluton(水平分辨率)、FocalPlaneYResolution(垂直分辨率)的单位。1、无单位;2、英寸;3、厘米。

注意:一些富士的数码相机(例如FX2700、FX2900、Finepix4700/40i等)的值为3,所以单位是‘厘米’,但实际上使用了'8.3mm'(1/3in.?)作为其单位。这是富士相机的BUG?Finepix4900Z已改此值使用2 ,但是还是没有同实际的值相吻合。

0xa215

ExposureIndex

(曝光量)

unsigned rational

1

Same as ISOSpeedRatings(0x8827) but data type is unsigned rational. Only Kodak's digicam uses this tag instead of ISOSpeedRating, I don't know why(historical reason?).

与ISOSpeedRatings(0x8827)(ISO)的值相同,但用(unsigned rational)无符号分数表示。只有柯达的数码相机使用这个标签而不用ISOSpeedRating(ISO)。

0xa217

SensingMethod

(传感方式)

unsigned short

1

Shows type of image sensor unit. '2' means 1 chip color area sensor, most of all digicam use this type.

图像传感器单位类型。2表示1个彩色区域传感器芯片,大多数数码相机使用这种类型。

0xa300

FileSource

(文件源)

undefined

1

Indicates the image source. Value '0x03' means the image source is digital still camera.

指出图像源。'0x03'表示图像源是数码相机。

0xa301

SceneType

(场景类型)

undefined

1

Indicates the type of scene. Value '0x01' means that the image was directly photographed.

指明场景的类型。值为'0x01'表示图像时直接拍摄。

0xa302

CFAPattern

undefined

Indicates the Color filter array(CFA) geometric pattern.

指明色彩滤镜矩阵(CFA)几何样式

Length

长度

Type

类型

Meaning

意义

2

short

Horizontal repeat pixel unit = n

水平重复单位像素 = n

2

short

Vertical repeat pixel unit = m

垂直重复单位像素 = m

1

byte

CFA value[0,0]

(CFA的值[0,0])

:

:

:

1

byte

CFA value[n-1,0]

1

byte

CFA value[0,1]

:

:

:

1

byte

CFA value[n-1,m-1]


The relation of filter color to CFA value is shown below.

CFA的值表示的色彩滤镜如下表:

Filter Color

Red

Green

Blue

Cyan

Magenta

Yellow

White

CFA value

0

1

2

3

4

5

6

 

R

G

G

B

For example, ordinary RGB filter uses the repetition of left chart, the value is '0x0002,0x0002,0x00,0x01,0x01,0x02'.

 

距离说明:一个普通RGB滤镜使用了左图的滤镜,他的值就为:'0x0002,0x0002,0x00,0x01,0x01,0x02'。

互用(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

免责声明:文章转载自《Android 下的EXIF》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ps/kill/pkill简单应用常用后端json处理方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IOS开发之尺寸

  在移动端或者前端开发中,UI图通常是带标注的,指定某个控件的长宽等属性,一般UI给的是68px,72px这样的样式,但是我们在开发过程中通常又并不是完全按照上面的标注去设置值,有时候需要将这个标注除以2或者除以3在进行赋值给frame,这其中的原因是因为标注一般都是按px格式给的,但是iOS底层绘制的时候是按照pt为单位进行绘制,这两个的区别在于:...

SpringBoot 动态修改定时任务频率

原文:https://cloud.tencent.com/developer/article/1627714 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import or...

EhCache之最简单的缓存框架

一、简介 Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他...

python json.dumps() 中文乱码问题

python 输出一串中文字符,在控制台上(控制台使用UTF-8编码)通过print 可以正常显示,但是写入到文件中之后,中文字符都输出成ascii编码了。英文字符能正常显示可读字符。 原因:json.dumps 序列化时默认使用的ascii编码,想输出真正的中文需要指定ensure_ascii=False:更深入分析,是应为dJSONobject 不是单...

Android Studio的串口通讯开发

基于android-serialport-api实现 前言RS232标准接口UARTRS232与UART转接下载 NDK 和构建工具创建支持 C/C++ 的新项目编译C/C++代码串口通讯原理关于校验位HexString与Bytes的转换参考 前言 软件代码写久了,总会对嵌入式开发感兴趣,因为软件的东西写来写去看不见摸不着,而嵌入式硬件开发,可以捣...

ASCII码、HEX、字符、BCD 等等 基础知识思考

每每遇到这些问题就要想个半天,想不明白还不舒服,今天特别把所想整理下避免以后再次进入思想漩涡!!!计算机存储和传输都是以字节为单位1 bit = 1 二进制数据1 byte = 8 bit1 字母 = 1 byte = 8 bit1 汉字 = 2 byte = 16 bit1. bit:位一个二进制数据0或1,是1bit;2. byte:字节存储空间的基本...