精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android實現(xiàn)JPEG圖片壓縮后同時保留圖片的EXIF信息

移動開發(fā) Android
在實際開發(fā)中,對于圖片數(shù)據(jù)不論是緩存在本地磁盤還是上傳到后端,都需要先對圖片進行壓縮處理。在圖片壓縮的過程中,為了減小文件大小,一些不重要的元數(shù)據(jù)(包括EXIF信息)可能會被移除或修改。如果圖片經(jīng)過壓縮處理,其原始的EXIF信息可能會丟失或不完整。

EXIF信息是可交換圖像文件格式(Exchangeable Image File Format)的縮寫,是在JPEG格式的基礎(chǔ)上發(fā)展起來的,其中包含了一系列按照一定標準制定的有關(guān)圖像拍攝信息的數(shù)據(jù)和索引,包括快門速度、光圈、ISO感光度、曝光偏移、日期和時間、閃光使用情況、焦距、GPS定位數(shù)據(jù)等。

在實際開發(fā)中,對于圖片數(shù)據(jù)不論是緩存在本地磁盤還是上傳到后端,都需要先對圖片進行壓縮處理。在圖片壓縮的過程中,為了減小文件大小,一些不重要的元數(shù)據(jù)(包括EXIF信息)可能會被移除或修改。如果圖片經(jīng)過壓縮處理,其原始的EXIF信息可能會丟失或不完整。

EXIF信息附加于JPEG、TIFF、RIFF等文件之中,可以記錄數(shù)碼照片的屬性信息和拍攝數(shù)據(jù)。比如記錄以下信息:

項目

資訊(舉例)

制造廠商

Canon

相機型號

Canon EOS-1Ds Mark III

影像方向

正常(upper-left)

影像解析度X

300

影像解析度Y

300

解析度單位

dpi

軟件

Adobe Photoshop CS Macintosh

最后異動時間

2005:10:06 12:53:19

YCbCrPositioning

2

曝光時間

0.00800 (1/125) sec

光圈值

F22

拍攝模式

光圈優(yōu)先

ISO感光值

100

Exif資訊版本

30,32,32,31

影像拍攝時間

2005:09:25 15:00:18

影像存入時間

2005:09:25 15:00:18

曝光補償(EV+-)

0

測光模式

點測光(Spot)

閃光燈

關(guān)閉

鏡頭實體焦長

12 mm

Flashpix版本

30,31,30,30

影像色域空間

sRGB

影像尺寸X

5616 pixel

影像尺寸Y

3744 pixel

有一些壓縮工具或軟件提供了保留EXIF信息的選項。在使用這些工具進行壓縮時,可以選擇保留EXIF信息,以確保壓縮后的圖片仍然包含完整的元數(shù)據(jù)。在實際開發(fā)中我們?nèi)绾芜M行保留EXIF信息的同時進行圖片壓縮呢?

使用ExifInterface方案

ExifInterface是Android系統(tǒng)中用于描述多媒體文件(如JPG格式圖片)附加信息的一個類。它主要涵蓋了拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種拍攝條件,以及相機品牌、型號、色彩編碼、拍攝時錄制的聲音以及全球定位系統(tǒng)(GPS)和縮略圖等信息。簡單來說,ExifInterface就是JPEG圖像文件+拍攝參數(shù)的結(jié)合。

ExifInterface類主要提供了讀取、寫入和縮略圖處理這三個方面的功能。通過ExifInterface,可以獲取到圖片的多種屬性,如方向(orientation)、拍攝時間(dateTime)、設(shè)備制造商(make)、設(shè)備型號(model)等。

ExifInterface類只提供了 getXXX() 和 setAttributes(String tag, String value) 這種操作單個屬性的方法,如果想將原圖片文件中的所有EXIF信息完整復(fù)制到另一個圖片中會非常繁瑣。因此有人通過反射,對所有屬性名進行遍歷,從而實現(xiàn)了批量操作。也算是一種解決方案,具體如下:

public static void saveExif(String oldFilePath, String newFilePath) throws Exception {
    ExifInterface oldExif = new ExifInterface(oldFilePath);
    ExifInterface newExif = new ExifInterface(newFilePath);
    Class<ExifInterface> cls = ExifInterface.class;
    Field[] fields = cls.getFields();
    for (int i = 0; i < fields.length; i++) {
        String fieldName = fields[i].getName();
        if (!TextUtils.isEmpty(fieldName) && fieldName.startsWith("TAG")) {
            String fieldValue = fields[i].get(cls).toString();
            String attribute = oldExif.getAttribute(fieldValue);
            if (attribute != null) {
                newExif.setAttribute(fieldValue, attribute);
            }
        }
    }
    //將內(nèi)存中的修改寫入磁盤(IO操作)
    newExif.saveAttributes();
 }

以上方案弊端也很明顯,就是需要對文件進行多次IO操作。觀察上面方法中的兩個參數(shù)都是文件路徑,比如我們通過拍照進行圖片壓縮上傳,那么拍完照通過 onPictureTaken(byte[] data, Camera camera) 回調(diào)方法拿到圖片的 byte[] data 數(shù)據(jù)后處理是這樣的:

  • 將data緩存到磁盤,路徑為oldFilePath;(IO)
  • 將data轉(zhuǎn)換成 bitmap 進行壓縮、旋轉(zhuǎn)、剪切等操作;
  • 將處理后的 bitmap 緩存到磁盤,路徑為newFilePath;(IO)
  • 調(diào)用上面的 saveExif(oldFilePath, newFilePath) 方法; (IO)

能否只在內(nèi)存中操作?發(fā)現(xiàn)有 ExifInterface (String filename) 和 ExifInterface (InputStream inputStream) 兩種構(gòu)造方法, 進行如下改造:

public static void saveExif(byte[] srcData, String destFilePath) throws Exception {
    ExifInterface oldExif = new ExifInterface(new ByteArrayInputStream(srcData));
    ExifInterface newExif = new ExifInterface(destFilePath);
    Class<ExifInterface> cls = ExifInterface.class;
    Field[] fields = cls.getFields();
    for (int i = 0; i < fields.length; i++) {
        String fieldName = fields[i].getName();
        if (!TextUtils.isEmpty(fieldName) && fieldName.startsWith("TAG")) {
            String fieldValue = fields[i].get(cls).toString();
            String attribute = oldExif.getAttribute(fieldValue);
            if (attribute != null) {
                newExif.setAttribute(fieldValue, attribute);
            }
        }
    }
    //將內(nèi)存中的修改寫入磁盤(IO操作)
    newExif.saveAttributes();
 }

使用自定義方案

不管是圖片還是其他文件,本質(zhì)都是格式化的數(shù)據(jù),都有專用的數(shù)據(jù)結(jié)構(gòu)。研究下JPG的數(shù)據(jù)結(jié)構(gòu),找到 EXIF 數(shù)據(jù)塊的起始索引,然后從源文件byte[]中復(fù)制插入到目標文件byte[]對應(yīng)位置中就實現(xiàn)了。

圖片圖片

JPEG文件的內(nèi)容都開始于一個二進制的值 '0xFFD8', 并結(jié)束于二進制值'0xFFD9'. 在JPEG的數(shù)據(jù)中有好幾種類似于二進制 0xFFXX 的數(shù)據(jù)都統(tǒng)稱作 "標記", 代表了一段JPEG的信息數(shù)據(jù)。

0xFFD8 的意思是 SOI圖像起始(Start of image) ,是Jpeg文件的魔數(shù)(Magic Number)。每種格式的文件都有固定的Magic Number,比如.class 字節(jié)碼文件的Magic Number是 “0xCAFEBABE”。0xFFD9 則表示 EOI圖像結(jié)束 (End of image)。

0xFF+標記號(1個字節(jié))+數(shù)據(jù)大小描述符(2個字節(jié))+數(shù)據(jù)內(nèi)容(n個字節(jié))

對于EXIF數(shù)據(jù),使用的是APP1標記,前兩個字節(jié)固定為 0xFFE1,后面緊跟著兩個字節(jié)記錄的是EXIF數(shù)據(jù)內(nèi)容的 length + 2,假設(shè)這兩個字節(jié)的值是 24,那么EXIF數(shù)據(jù)內(nèi)容的長度就是22字節(jié)。所以只要找到EXIF在數(shù)組中的起始索引,摳出來插入到新數(shù)組中去就完成了。

圖片圖片

public static byte[] cloneExif(byte[] srcData, byte[] destData) {
    if (srcData == null || srcData.length == 0 || destData == null || destData.length == 0) return null;

    ImageHeaderParser srcImageHeaderParser = new ImageHeaderParser(srcData);
    byte[] srcExifBlock = srcImageHeaderParser.getExifBlock();
    if (srcExifBlock == null || srcExifBlock.length <= 4) return null;

    LOG.d(TAG, "pictureData src: %1$s KB; dest: %2$s KB", srcData.length / 1024, destData.length / 1024);
    LOG.d(TAG, "srcExif: %s B", srcExifBlock.length);
    ImageHeaderParser destImageHeaderParser = new ImageHeaderParser(destData);
    byte[] destExifBlock = destImageHeaderParser.getExifBlock();
    if (destExifBlock != null && destExifBlock.length > 0) {
        LOG.d(TAG, "destExif: %s B", destExifBlock.length);
        //目標圖片中已有exif信息, 需要先刪除
        int exifStartIndex = destImageHeaderParser.getExifStartIndex();
        //構(gòu)建新數(shù)組
        byte[] newDestData = new byte[srcExifBlock.length + destData.length - destExifBlock.length];
        //copy 1st block
        System.arraycopy(destData, 0, newDestData, 0, exifStartIndex);
        //copy 2rd block (exif)
        System.arraycopy(srcExifBlock, 0, newDestData, exifStartIndex, srcExifBlock.length);
        //copy 3th block
        int srcPos = exifStartIndex + destExifBlock.length;
        int destPos = exifStartIndex + srcExifBlock.length;
        System.arraycopy(destData, srcPos, newDestData, destPos, destData.length - srcPos);
        LOG.d(TAG, "output image Data with exif: %s KB", newDestData.length / 1024);
        return newDestData;
    } else {
        LOG.d(TAG, "destExif: %s B", 0);
        //目標圖片中沒有exif信息
        byte[] newDestData = new byte[srcExifBlock.length + destData.length];
        //copy 1st block (前兩個字節(jié))
        System.arraycopy(destData, 0, newDestData, 0, 2);
        //copy 2rd block (exif)
        System.arraycopy(srcExifBlock, 0, newDestData, 2, srcExifBlock.length);
        //copy 3th block
        int srcPos = 2;
        int destPos = 2 + srcExifBlock.length;
        System.arraycopy(destData, srcPos, newDestData, destPos, destData.length - srcPos);
        LOG.d(TAG, "output image Data with exif: %s KB", newDestData.length / 1024);
        return newDestData;
    }

}

將原圖的數(shù)據(jù)流和壓縮處理后的數(shù)據(jù)流傳入,調(diào)用cloneExif方法,返回附加了EXIF信息的數(shù)據(jù)流,將返回的數(shù)據(jù)流存儲即得到一張帶有原EXIF信息的壓縮圖片。

「注意」上述方法只針對JPEG格式圖片,其他格式文件數(shù)據(jù)結(jié)構(gòu)不同,方法可能無效。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2024-04-19 08:31:40

Android屬性讀取

2009-08-20 12:35:41

C#讀取圖片的EXIF

2020-05-07 09:45:16

前端JS圖片壓縮

2009-08-24 17:02:18

C#旋轉(zhuǎn)圖片EXIF

2020-10-20 11:12:11

Nodejs

2013-07-29 10:02:42

2022-08-08 08:29:55

圖片壓縮前端互聯(lián)網(wǎng)

2023-11-04 12:43:44

前端圖片參數(shù)

2018-10-29 09:24:41

Web圖片壓縮網(wǎng)頁加速

2023-01-15 20:28:32

前端圖片壓縮

2010-10-12 13:57:43

GoogleWebP

2013-06-27 11:16:27

Android異步加載

2022-07-17 11:22:35

前端開發(fā)圖片裁切壓縮上傳

2016-03-29 10:18:48

Android圖片代碼

2023-08-21 12:13:53

2011-04-11 14:14:29

checkboxlistviewAndroid

2020-08-21 09:58:16

谷歌Android工具

2022-06-14 07:29:51

squoosh壓縮工具開源

2011-05-30 13:23:11

Android 動畫

2013-05-15 10:27:05

R語言
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲影音先锋| 精品少妇3p| 一区二区三区四区高清精品免费观看 | 日本中文字幕在线2020| 久久se精品一区精品二区| 欧美丰满片xxx777| 好吊视频在线观看| 电影91久久久| 欧美午夜精品久久久久久人妖| 亚洲福利av在线| 成人免费视频国产免费麻豆| 久久精品女人天堂| 美女福利精品视频| 人妻av无码一区二区三区| 天天综合在线观看| 欧美日韩在线看| 国产免费xxx| 黄上黄在线观看| 国产白丝精品91爽爽久久| 国产成+人+综合+亚洲欧美丁香花| 少妇高潮惨叫久久久久| 天堂99x99es久久精品免费| 欧美精品一卡两卡| 日本成年人网址| 另类视频在线| 国产精品久久毛片| 欧美三级网色| 亚洲爱情岛论坛永久| 美国一区二区三区在线播放| 97超级碰碰人国产在线观看| 国产高潮国产高潮久久久91| 日本黄色精品| 亚洲欧美日韩国产成人| 韩国黄色一级片| 日韩av黄色| 色狠狠一区二区| 国产午夜大地久久| 黄色成人在线网| 亚洲婷婷在线视频| 亚洲国产一区二区在线 | 亚洲网站在线看| 久久久老熟女一区二区三区91| www.成人| 欧美日韩国产另类不卡| 日韩一级片播放| 涩涩网在线视频| 亚洲高清视频在线| 欧美成人精品免费| 暖暖在线中文免费日本| 亚洲欧美乱综合| 在线观看精品视频| 欧美一区二区三区| 国产精品对白交换视频| 水蜜桃一区二区| 国模精品一区二区| 国产亚洲一区二区三区四区 | 色综合视频在线| 丁香婷婷综合五月| 国产精品v欧美精品∨日韩| 国产jzjzjz丝袜老师水多| 国产中文字幕精品| 99热最新在线| 丰满大乳国产精品| thepron国产精品| 黄色国产精品一区二区三区| 天天操天天插天天射| 99国内精品久久| 乱一区二区三区在线播放| 欧美zozo| 欧美国产精品专区| 自拍偷拍一区二区三区| 精品自拍一区| 亚洲一区二区三区四区在线| 国产精品久久久久7777| 僵尸再翻生在线观看| 欧美性极品少妇精品网站| 亚洲乱码中文字幕久久孕妇黑人| 女生影院久久| 精品视频1区2区3区| 国产九九热视频| 国产一区二区三区黄网站| 日韩欧美你懂的| 亚洲图片综合网| 自拍自偷一区二区三区| 最近2019年日本中文免费字幕| 99成人在线观看| 国产精品99一区二区| 91av中文字幕| 中文字幕在线视频免费| 国产在线日韩欧美| 久久99精品久久久水蜜桃| yjizz视频网站在线播放| 亚洲人成网站在线| 国产主播自拍av| 日韩成人亚洲| 日韩精品中文字幕在线一区| 国产精品815.cc红桃| 91影院成人| 久久久久久免费精品| 九九热最新视频| 国内精品伊人久久久久影院对白| 国产精品麻豆免费版| 国产在线观看网站| 亚洲三级在线播放| 免费黄色日本网站| 9.1麻豆精品| 日韩成人在线电影网| 国产精品18在线| 国产情侣久久| 91色在线观看| 国产区av在线| 亚洲高清视频的网址| av在线无限看| 精品国产影院| 欧美成人久久久| 看黄色一级大片| 成人激情免费网站| 久久av秘一区二区三区| 大桥未久在线视频| 欧美一级欧美一级在线播放| 波多野结衣av在线观看| 亚洲国产高清一区| 国产中文字幕日韩| 国产中文字幕在线| 亚洲国产精品久久久久秋霞影院| 亚洲一区日韩精品| 九色精品91| 91po在线观看91精品国产性色| 精品国产999久久久免费| 国产精品视频免费看| 乱妇乱女熟妇熟女网站| 都市激情亚洲欧美| 欧美插天视频在线播放| 亚洲天堂777| 久久久五月婷婷| 国产精品333| 高清日韩欧美| 欧美第一黄网免费网站| 国产人妖一区二区三区| 国产精品国产三级国产| 一区二区三区入口| japanese国产精品| 国产精品www网站| 男人天堂资源在线| 一本色道亚洲精品aⅴ| 一出一进一爽一粗一大视频| 影音先锋中文字幕一区| 不卡视频一区二区| 毛片网站在线看| 日韩欧美电影一区| 久久国产露脸精品国产| 国产成人免费视频一区| 超碰10000| 久久9999免费视频| 欧美成人第一页| 亚洲国产日韩在线观看| 一区二区三区中文字幕精品精品 | 国产一区二区三区视频免费| 精品人妻一区二区三区免费看 | www亚洲色图| 青青草国产成人av片免费| 水蜜桃一区二区| 亚洲精品大全| 九九热最新视频//这里只有精品 | 激情伊人五月天久久综合| 亚洲欧美日韩另类精品一区二区三区| 国产成人精品一区二三区在线观看 | 91 在线视频观看| 97精品视频在线看| 91在线播放国产| 四虎影视成人| 日韩成人av一区| 黄色免费av网站| 国产精品无人区| 国产探花在线观看视频| 亚洲一级网站| 久久综合入口| 日韩欧国产精品一区综合无码| 久久躁狠狠躁夜夜爽| 超碰人人人人人人| 精品免费在线观看| 免费在线观看a视频| 国产最新精品免费| av网站手机在线观看| 亚洲另类春色校园小说| 国产精品亚洲自拍| 青青在线视频| 亚洲欧美激情精品一区二区| 一女二男一黄一片| 亚洲国产精品天堂| 久操视频在线观看免费| 国产剧情在线观看一区二区| 内射国产内射夫妻免费频道| 热久久天天拍国产| 国产有色视频色综合| av在线不卡精品| 久久91亚洲精品中文字幕奶水| 无码精品人妻一区二区三区影院 | 国产绿帽刺激高潮对白| 亚洲国产日韩精品| 极品蜜桃臀肥臀-x88av| 国产suv一区二区三区88区| 免费裸体美女网站| 欧美人成在线| 日本在线观看一区二区| 亚洲免费一区三区| 国产精品吴梦梦| 91超碰在线播放| 日韩亚洲在线观看| 手机亚洲第一页| 日韩精品一区二区三区中文精品| 青青国产在线视频| 亚洲aaa精品| 日本高清不卡免费| 久久久精品天堂| www男人天堂| 精品一区二区三区日韩| 可以免费观看av毛片| 狠狠综合久久| 在线电影看在线一区二区三区| 三级精品视频| 国产精品精品软件视频| 成人在线啊v| 国产精品久久久久aaaa九色| 精精国产xxxx视频在线播放| 久久99国产精品自在自在app| 成人精品一区二区| 亚洲免费一级电影| 香蕉国产在线视频| 日韩女优电影在线观看| 96亚洲精品久久久蜜桃| 在线视频欧美精品| 6080午夜伦理| 婷婷成人综合网| 黄色激情视频在线观看| 亚洲综合清纯丝袜自拍| 黑鬼狂亚洲人videos| 国产精品进线69影院| jizz18女人高潮| 久久久高清一区二区三区| 国产精品无码一区二区三区免费| 高清av一区二区| 日本成人在线免费| 国产精品一区二区在线观看网站 | 亚洲人成电影网站色xx| 神马久久高清| 国产丝袜一区二区三区免费视频| 午夜小视频在线播放| 亚洲第一区中文字幕| 可以免费观看的毛片| 亚洲风情亚aⅴ在线发布| 亚洲国产成人在线观看| 精品卡一卡二卡三卡四在线| 亚洲第九十九页| 精品福利一区二区三区| 国产成人三级在线观看视频| 精品国产三级电影在线观看| 免费国产羞羞网站视频| 亚洲国产成人在线播放| 污视频在线免费观看| 国产午夜精品久久久| 国产露出视频在线观看| 伊人青青综合网站| 2021av在线| 欧美成人免费va影院高清| 黄网av在线| …久久精品99久久香蕉国产| 伊人久久在线| 国产精品美女视频网站| av日韩一区| 成人女人免费毛片| 亚洲综合福利| 亚洲人体一区| 欧美网站在线| 欧美在线观看成人| 蜜桃一区二区三区在线| 国内精品国产三级国产aⅴ久| 国产aⅴ综合色| ass精品国模裸体欣赏pics| 欧美国产精品一区二区| 免费国产羞羞网站美图| 亚洲午夜精品在线| 在线免费观看av网址| 正在播放一区二区| 日本高清视频www| 国产亚洲精品va在线观看| 黄视频在线观看网站| 久久久久久久久久久免费精品| 日韩大片欧美大片| 亚洲r级在线观看| 天堂俺去俺来也www久久婷婷| 日韩欧美亚洲区| 国产综合精品| 亚洲性生活网站| 丁香一区二区三区| 青青草华人在线视频| 亚洲国产精品一区二区www在线 | 久久精品国产理论片免费| 日韩中文首页| 国产资源在线免费观看| 麻豆精品国产传媒mv男同| 亚洲激情 欧美| 一区在线观看免费| 国产www在线| 欧美成人r级一区二区三区| 国产片在线观看| 国内成人精品一区| 一区二区三区无毛| 欧美日韩精品久久| 国内精品久久久久国产盗摄免费观看完整版| 无码人妻h动漫| 国产麻豆精品theporn| 蜜乳av中文字幕| 亚洲第一搞黄网站| 国产亲伦免费视频播放| 这里只有视频精品| 在线观看v片| 国产日韩欧美一区二区三区四区| 天天揉久久久久亚洲精品| 成人一级片网站| 成人精品免费看| 天天看片中文字幕| 欧美日韩激情在线| 韩国中文免费在线视频| 7777免费精品视频| 99香蕉久久| 狠狠干视频网站| 精品一区二区三区在线视频| 亚洲自拍偷拍图| 欧美日韩另类字幕中文| 免费看日韩av| 九九久久国产精品| 精品国产乱码一区二区三区| 亚洲精品成人自拍| 青青草国产精品亚洲专区无| 国产精品天天干| 色av一区二区| 免费福利在线视频| 欧美做爰性生交视频| 欧美xxxx在线| 欧美二区在线视频| av在线不卡免费看| 日韩无码精品一区二区三区| 精品国产91洋老外米糕| 国内在线视频| 成人在线视频网址| 亚洲第一在线| 污污内射在线观看一区二区少妇| 亚洲国产日韩一级| 天天综合网在线观看| 91精品国产91久久久久久吃药| 精品人人人人| 99热在线这里只有精品| 91麻豆国产在线观看| www.com亚洲| 一本色道久久综合亚洲精品小说| 成人mm视频在线观看| 一本久道久久综合狠狠爱亚洲精品 | 欧美国产日韩一区二区三区| 一区二区亚洲视频| 国产精品久久久久9999爆乳| 成人丝袜视频网| 精品成人av一区二区在线播放| 亚洲精品视频免费在线观看| 视频在线日韩| 在线视频不卡一区二区| 狠狠色伊人亚洲综合成人| 欧美成人一区二区三区高清| 精品电影一区二区| 美女视频在线免费| 神马一区二区影院| 国内精品第一页| 一级aaa毛片| 亚洲午夜久久久久久久| 欧美黄页免费| 99国产精品白浆在线观看免费| 不卡一区二区三区四区| 亚洲成熟少妇视频在线观看| 色香阁99久久精品久久久| 日本精品在线观看| 国产午夜福利在线播放| 国产精品伦理一区二区| 国产激情视频在线播放| 欧美在线免费看| 欧美一区二区三区激情视频| 日本黄色一级网站| 欧美日韩国产色视频| 午夜激情视频在线| 国产综合av一区二区三区| 日日骚欧美日韩| 青青草原在线免费观看| 精品视频在线导航| 久久人人视频| 国产特级淫片高清视频| 亚洲国产精品av| 亚洲欧美黄色片| 国产精品三级美女白浆呻吟 | 国产成人a亚洲精v品无码| 国产精品福利影院| 天天摸天天碰天天爽天天弄|