欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android下的EXIF是什么

 更新時(shí)間:2016年04月11日 15:44:37   作者:Hankkin  
這篇文章主要為大家詳細(xì)介紹了Android下的EXIF是什么,Exif(Exchangeable Image File 可交換圖像文件)是一種圖象文件格式,它的數(shù)據(jù)存儲(chǔ)與JPEG格式是完全相同的,想要深入了解的朋友可以參考一下

一.什么是Exif
Exif(Exchangeable Image File 可交換圖像文件)是一種圖象文件格式,它的數(shù)據(jù)存儲(chǔ)與JPEG格式是完全相同的。實(shí)際上Exif格式就是在JPEG格式頭部插入了數(shù)碼照片的信息,包括拍 攝時(shí)的光圈、快門(mén)、白平衡、ISO、焦距、日期時(shí)間等各種和拍攝條件以及相機(jī)品牌、型號(hào)、色彩編碼、拍攝時(shí)錄制的聲音以及全球定位系統(tǒng)(GPS)、縮略圖 等。簡(jiǎn)單地說(shuō),Exif=JPEG+拍攝參數(shù)。因此,你可以利用任何可以查看JPEG文件的看圖軟件瀏覽Exif格式的照片,但并不是所有的圖形程序都能 處理 Exif信息。

所有的JPEG文件以字符串“0xFFD8”開(kāi)頭,并以字符串“0xFFD9”結(jié)束。文件頭中有一系列“0xFF??”格式的字符串,稱為“標(biāo)識(shí)”,用來(lái) 標(biāo)記JPEG文件的信息段?!?xFFD8”表示圖像信息開(kāi)始,“0xFFD9”表示圖像信息結(jié)束,這兩個(gè)標(biāo)識(shí)后面沒(méi)有信息,而其它標(biāo)識(shí)緊跟一些信息字 符。
  0xFFE0 -- 0xFFEF之間的標(biāo)識(shí)符稱為“應(yīng)用標(biāo)記”,沒(méi)有被常規(guī)JPEG文件利用,Exif正是利用這些信息串記錄拍攝信息如快門(mén)速度、光圈值等,甚至可以包括全 球定位信息。按照Exif2.1標(biāo)準(zhǔn)對(duì)這些標(biāo)識(shí)符的定義,數(shù)碼相機(jī)可以把各種拍攝信息記入數(shù)碼圖像中,應(yīng)用軟件可以讀取這些數(shù)據(jù),再按照Exif2.1標(biāo) 準(zhǔn),檢索出它們的具體含義,一般而言包括以下一些信息:
  Image Description 圖像描述、來(lái)源. 指生成圖像的工具
  Artist作者 有些相機(jī)可以輸入使用者的名字
  Make 生產(chǎn)者 指產(chǎn)品生產(chǎn)廠家
  Model 型號(hào) 指設(shè)備型號(hào)
  Orientation方向 有的相機(jī)支持,有的不支持
  XResolution/YResolution X/Y方向分辨率 本欄目已有專門(mén)條目解釋此問(wèn)題。
  ResolutionUnit分辨率單位 一般為PPI
  Software軟件 顯示固件Firmware版本
  DateTime日期和時(shí)間
  YCbCrPositioning 色相定位
  ExifOffsetExif信息位置,定義Exif在信息在文件中的寫(xiě)入,有些軟件不顯示。
  ExposureTime 曝光時(shí)間 即快門(mén)速度
  FNumber光圈系數(shù)
  ExposureProgram曝光程序 指程序式自動(dòng)曝光的設(shè)置,各相機(jī)不同,可能是Sutter Priority(快門(mén)優(yōu)先)、Aperture Priority(快門(mén)優(yōu)先)等等。
  ISO speed ratings感光度
  ExifVersionExif版本
  DateTimeOriginal創(chuàng)建時(shí)間
  DateTimeDigitized數(shù)字化時(shí)間
  ComponentsConfiguration圖像構(gòu)造(多指色彩組合方案)
  CompressedBitsPerPixel(BPP)壓縮時(shí)每像素色彩位 指壓縮程度
  ExposureBiasValue曝光補(bǔ)償。
  MaxApertureValue最大光圈
  MeteringMode測(cè)光方式, 平均式測(cè)光、中央重點(diǎn)測(cè)光、點(diǎn)測(cè)光等。
  Lightsource光源 指白平衡設(shè)置
  Flash是否使用閃光燈。
  FocalLength焦距,一般顯示鏡頭物理焦距,有些軟件可以定義一個(gè)系數(shù),從而顯示相當(dāng)于35mm相機(jī)的焦距 MakerNote(User Comment)作者標(biāo)記、說(shuō)明、記錄
  FlashPixVersionFlashPix版本 (個(gè)別機(jī)型支持)
  ColorSpace色域、色彩空間
  ExifImageWidth(Pixel X Dimension)圖像寬度 指橫向像素?cái)?shù)
  ExifImageLength(Pixel Y Dimension)圖像高度 指縱向像素?cái)?shù)
  Interoperability IFD通用性擴(kuò)展項(xiàng)定義指針 和TIFF文件相關(guān),具體含義不詳
  FileSource源文件 Compression壓縮比。

二.Camera中拍照流程

在Android Camera程序開(kāi)發(fā)過(guò)程中,要用到Exif相關(guān)的知識(shí),如果處理不當(dāng),會(huì)導(dǎo)致拍攝的JPEG圖片無(wú)法正常瀏覽。
在Froyo(Android 2.2)源碼中的Camera應(yīng)用是不對(duì)Exif信息進(jìn)行寫(xiě)操作,而只是讀操作,對(duì)于Exif的寫(xiě)操作是交給Camera硬件抽象層去完成,這是 google的設(shè)計(jì)邏輯。但是不同的Android平臺(tái)及其相關(guān)子平臺(tái),再加上不同的Camera應(yīng)用,相互交替,排列組合,或許會(huì)出現(xiàn)這樣一種情況:底 層沒(méi)有去寫(xiě)Exif,而上層應(yīng)用也沒(méi)有寫(xiě)Exif信息,那么圖片的顯示信息將會(huì)丟失。其中影響最為嚴(yán)重的是Orientation這個(gè)參數(shù)。

Froyo camera的邏輯是這樣的:
在Camera這個(gè)Activity中,有一個(gè)內(nèi)部類ImageCapture,其中包含一個(gè)重要的方法:

private void capture() {
// Set rotation.
mParameters.setRotation(mLastOrientation);
....................
.....................
 mCameraDevice.setParameters(mParameters);

mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback, mPostViewPictureCallback, new JpegPictureCallback(loc));
}

大致流程是這樣的:
1.將拍照時(shí)相機(jī)的方向添加進(jìn)Camera.Parameters的實(shí)例中;
2.將全部相機(jī)拍照參數(shù)傳給android.hardware.Camera的對(duì)象;
3.調(diào)用方法takePicture,并設(shè)置好非常重要的4個(gè)callback;
4.生成Exif數(shù)據(jù)的事情就由HAL來(lái)完成;
5.第4個(gè)callback返回?cái)?shù)據(jù)(這個(gè)callback是最重要的,而且是不可缺省的,也就是說(shuō)前3個(gè)callback設(shè)置成Null也不會(huì)影響拍照功能),見(jiàn)如下代碼:

private final class JpegPictureCallback implements PictureCallback {
public void onPictureTaken(final byte[] jpegData, final android.hardware.Camera camera) {
//jpegData為JPEG數(shù)據(jù),是由HAL層根據(jù)應(yīng)用傳輸?shù)母鞣N參數(shù)(即Camera.Parameters的實(shí)例)以及JPEG壓縮算法生成的。
mImageCapture.storeImage(jpegData, camera, mLocation);
}
}

三.Exif使用方法及代碼優(yōu)化方案

什么地方用到Exif信息呢?我遇到的至少有如下這么幾個(gè)地方:
1.生成右上角所略圖;
2.圖片顯示應(yīng)用,例如android自帶的gallery3d應(yīng)用;
3.圖片回顯;
4.短(彩)信等需要添加camera附件的應(yīng)用.

看看源碼: ImageManager中是這樣讀取Exif方向參數(shù)的。

  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;
  }

這個(gè)方法可以進(jìn)一步優(yōu)化,從而對(duì)于Exif信息的寫(xiě)入不再依賴底層。那就是比較一下傳輸給底層的orientation與實(shí)際返回的是否相等,不相等就是底層寫(xiě)入Exif信息出錯(cuò),我們就可以在應(yīng)用層進(jìn)行修正。
可以添加一個(gè)判斷分支如下:(其中EXIF_ORIENTATION是我們緩存的應(yīng)用傳給底層的值)。

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);
        }
      }

在應(yīng)用層對(duì)于Exif的操作是通過(guò)android.media.ExifInterface接口完成的。
通過(guò)public void setAttribute (String tag, String value) 來(lái)設(shè)置,而獲取可以通過(guò) public int getAttributeInt (String tag, int defaultValue) 和 public String getAttribute (String tag) 兩種方法都可以,getAttributeInt 重載方法一第二個(gè)參數(shù)為我們?cè)O(shè)置的默認(rèn)值,如果成功則返回相應(yīng)Tag的值;特定的整數(shù)內(nèi)容為該方法直接返回值。而重載方法二該方法直接返回結(jié)果,如果失敗則為null。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論