解決JPEG照片在windows無法打開

引言

今天烛谊,測試妹子拿個(gè)樣機(jī)過來說:“手機(jī)拍出來的照片拷貝到windows電腦上無法打開”。查了一下代碼渗鬼,僅僅是一個(gè)bitmap.compress(Bitmap.CompressFormat.JPEG, 90, data)篡撵,用過無數(shù)次的方法,無論如何不可能出問題脾歧。那么問題肯定出在電腦上了,百度一下演熟,還真有解決方案鞭执,將windows顏色系統(tǒng)的默認(rèn)值改為 “Agfa:Swop Standard”,可以正常顯示了芒粹。本想告訴測試妹子解決方案兄纺,但卻總隱約覺得不對(duì)勁,仔細(xì)排查一圈下來發(fā)現(xiàn)是JPEG圖片的EXIF信息出了問題化漆。

1. 問題現(xiàn)象

手機(jī)拍照后估脆,將照片拷貝到windows電腦上,使用windows照片查看器無法打開照片座云,提示:

Windows 照片查看器無法顯示此圖片疙赠,因?yàn)橛?jì)算機(jī)上的可用內(nèi)存可能不足。請關(guān)閉一些目前沒有使用的程序或者釋放部分硬盤空間(如果硬盤幾乎已滿)朦拖,然后重試圃阳。

windows打不開jpeg圖片.jpg

但是同樣的照片:

  • 在手機(jī)上可以正常顯示。
  • 點(diǎn)擊windows照片查看器的幻燈片放映也可以顯示贞谓。
  • 使用其它看圖工具也可以顯示限佩。

此時(shí)葵诈,電腦內(nèi)存或者磁盤空間是充足的裸弦。

2. 問題可能的原因

  • 可能的原因一:
    色彩空間不同,windows默認(rèn)的色彩空間是sRGB作喘,而很多相機(jī)理疙、手機(jī)的色彩空間是Adobe RGB。

  • 可能的原因二:
    JPEG圖片的EXIF信息有問題泞坦。由于某些相機(jī)APP處理照片后窖贤,修改或者添加了某些EXIF信息。例如贰锁,修改了圖片數(shù)據(jù)長度等赃梧,EXIF信息與實(shí)際圖片數(shù)據(jù)不一致,windows照片查看器無法正常解析照片豌熄,導(dǎo)致無法打開照片授嘀。甚至華為P40也有用戶反饋過類似的問題:照片傳到電腦里總是說Windows照片查看器無法顯示此圖片

什么是EXIF信息锣险?
EXIF信息是可交換圖像文件的縮寫蹄皱,是專門為數(shù)碼相機(jī)的照片設(shè)定的览闰,可以記錄數(shù)碼照片的屬性信息和拍攝數(shù)據(jù)。EXIF可以附加于JPEG巷折、TIFF压鉴、RIFF等文件之中,為其增加有關(guān)數(shù)碼相機(jī)拍攝信息的內(nèi)容和索引圖或圖像處理軟件的版本信息锻拘。

JPEG文件可包含實(shí)際的圖像數(shù)據(jù)和Exif信息油吭。Exif信息包括品牌、型號(hào)署拟、光圈上鞠、曝光時(shí)間、ISO芯丧、焦距芍阎、閃光、白平衡缨恒、日期時(shí)間谴咸、位置信息、色彩空間等等各種信息骗露。但不是所有JPEG文件都有Exif信息岭佳。

3. 解決方案

3.1 針對(duì)色彩空間不同,有兩種解決方案:

方案一:
不使用windows默認(rèn)的圖片查看器萧锉,使用其它看圖工具珊随。

方案二:
修改windows顏色系統(tǒng)的默認(rèn)值。打開windows “控制面板”柿隙,查看方式由 “類別” 修改為 “小圖標(biāo)”叶洞,打開 “顏色管理”,點(diǎn)擊 “高級(jí)” 選項(xiàng)卡禀崖,將“設(shè)備配置文件(D): ”由“系統(tǒng)默認(rèn)(sRGB IEC61966-2.1)” 改為 “Agfa:Swop Standard”衩辟。

Agfa.png

再次使用windows默認(rèn)的圖片查看器打開圖片,就可以正常顯示了波附。

3.2 針對(duì)JPEG圖片EXIF信息有問題艺晴,也有兩種解決方案:

方案一:
不使用windows默認(rèn)的圖片查看器,使用其它看圖工具掸屡。一些第三方的圖片查看器顯示圖片時(shí)封寞,并不依賴EXIF信息,它們可以正常顯示照片仅财。

方案二:
下載一個(gè) “jpg圖片修復(fù)工具”狈究,用它修復(fù)JPEG圖片的EXIF信息。修復(fù)后windows默認(rèn)的圖片查看器就可以正常顯示照片了满着。所謂的修復(fù)谦炒,其實(shí)就是重新生成與JPEG圖像數(shù)據(jù)一致的EXIF信息贯莺。

4. 實(shí)際android項(xiàng)目上的問題分析及解決

我們回到引言中測試妹子報(bào)的那個(gè)bug,這個(gè)展銳平臺(tái)的項(xiàng)目在Camera APP中集成了一個(gè)第三方算法庫宁改,大概的圖像格式的轉(zhuǎn)換流程為:


圖像格式轉(zhuǎn)換流程.png

如上圖缕探,JpegCallback中出來原JPEG圖片時(shí),還一起生成了圖片的EXIF信息还蹲。

首先爹耗,我懷疑色彩空間不是sRGB。于是將bitmap的ColorSpace打印出來:

2021-01-25 10:10:32.125 31995-32126/com.android.camera2 D/CAM2: bitmap.getColorSpace():sRGB IEC61966-2.1 (id=0, model=RGB),

發(fā)現(xiàn)色彩空間確實(shí)是sRGB谜喊。

那么潭兽,問題就應(yīng)該出在EXIF信息上了。再將EXIF信息打印出來斗遏,最終發(fā)現(xiàn)問題就出在JPEG圖片的數(shù)據(jù)長度上山卦。第三方算法輸出RGB,所以必須利用Bitmap將RGB壓縮成JPEG再保存诵次,再次壓縮后账蓉,新JPEG圖片的數(shù)據(jù)長度與原JPEG圖片的數(shù)據(jù)長度已經(jīng)不同了,新JPEG圖片的占用空間要比較原JPEG圖片大一點(diǎn)點(diǎn)逾一。日志證明了這一點(diǎn):

2021-01-25 10:33:35.155 31995-32126/com.android.camera2 D/CAM2:jpegData.length:2431896
2021-01-25 10:33:35.812 31995-32126/com.android.camera2 D/CAM2: newJpegData.length:2904395

所以铸本,問題的原因就是:圖片的EXIF信息在JpegCallback中出來原JPEG圖片時(shí)就生成了,后面圖片數(shù)據(jù)改變了遵堵,卻沒有更新EXIF信息箱玷。

而windows默認(rèn)圖片查看器又可能比較蠢,查看圖片時(shí)陌宿,按EXIF信息去分配內(nèi)存锡足,真正加載圖片時(shí)發(fā)現(xiàn)內(nèi)存不夠,所以就報(bào)一個(gè)內(nèi)存不足的提示限番,造成了難以理解的烏龍舱污。

知道了問題的原因呀舔,解決起來也就很簡單了弥虐,只需要更新一下EXIF信息中的數(shù)據(jù)長度:

exifInterface.setTagValue(ExifInterface.TAG_JPEG_LENGTH, newJpegData.length);

重新編譯、驗(yàn)證媚赖,果然霜瘪,拍出來的照片都可以正常用windows默認(rèn)圖片查看器打開顯示了。

通過這個(gè)bug惧磺,我們可以知道颖对,如果一張JPEG圖片除圖像數(shù)據(jù)外,還保存有EXIF信息磨隘,那么圖像數(shù)據(jù)需要和EXIF信息能對(duì)應(yīng)上缤底,否則會(huì)出現(xiàn)一些奇怪的問題顾患。如果對(duì)圖像數(shù)據(jù)進(jìn)行過編輯和處理,那么EXIF信息也要同步更新个唧。

5. 參考

Windows照片查看器無法顯示此圖片江解,因?yàn)橛?jì)算機(jī)上的可用內(nèi)存可能不足。
EXIF信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徙歼,一起剝皮案震驚了整個(gè)濱河市犁河,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魄梯,老刑警劉巖桨螺,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酿秸,居然都是意外死亡灭翔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門辣苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缠局,“玉大人,你說我怎么就攤上這事考润∠猎埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵糊治,是天一觀的道長唱矛。 經(jīng)常有香客問我,道長井辜,這世上最難降的妖魔是什么绎谦? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮粥脚,結(jié)果婚禮上窃肠,老公的妹妹穿的比我還像新娘。我一直安慰自己刷允,他們只是感情好冤留,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著树灶,像睡著了一般纤怒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上天通,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天泊窘,我揣著相機(jī)與錄音,去河邊找鬼。 笑死烘豹,一個(gè)胖子當(dāng)著我的面吹牛访娶,可吹牛的內(nèi)容都是我干的隐锭。 我是一名探鬼主播揣钦,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼竿秆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚌卤?” 一聲冷哼從身側(cè)響起实束,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逊彭,沒想到半個(gè)月后咸灿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侮叮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年避矢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囊榜。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡审胸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卸勺,到底是詐尸還是另有隱情砂沛,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布曙求,位于F島的核電站碍庵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悟狱。R本人自食惡果不足惜静浴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挤渐。 院中可真熱鬧苹享,春花似錦、人聲如沸浴麻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白胀。三九已至椭赋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間或杠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工宣蔚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留向抢,地道東北人认境。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像挟鸠,于是被迫代替她去往敵國和親叉信。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容