Android Q的一項新功能是支持高效圖像格式(HEIF)圖像,但為什么這很重要确虱?在這篇文章中含友,我們將看看HEIF實際上是什么,并了解它可能帶來的好處校辩。
HEIF由運動圖像專家組(MPEG)開發(fā)窘问,是一種壓縮容器格式,聲稱比JPEG更有效宜咒,同時提供更好的圖像質(zhì)量惠赫。聲稱HEIF圖像通常是JPEG等效圖像的??一半,同時具有高質(zhì)量故黑。
要在Android Q中實際使用HEIF圖像不需要任何費力儿咱,因為您可以在繪圖資源中包含與JPEG圖像完全相同的HEIF圖像。此外场晶,BitmapFactory它將以與JPEG圖像完全相同的方式對HEIF圖像進行充氣混埠。但由于硬件和許可要求,目前沒有向后兼容性诗轻。Pie中包含有限的支持ImageDecoder(有關(guān)如何使用的詳細信息钳宪,請參閱此文章ImageDecoder),但這取決于設(shè)備,這有點暗示存在硬件要求吏颖。
雖然目前沒有讀取HEIF圖像的向后兼容性搔体,但是有一個用于編寫它們的支持庫。它可以寫入Bitmap侦高,Surface或YUV字節(jié)緩沖區(qū)嫉柴。我們可以Bitmap從資產(chǎn)文件中讀取a 并使用以下內(nèi)容將其作為HEIF寫入本地緩存目錄HeifWriter:
suspend fun convertToHeif(assetName: String): Long {
return withContext(Dispatchers.IO) {
val bitmap = readBitmapAsset(assetName)
val file = File(context.cacheDir, "beach_huts.heif")
HeifWriter.Builder(
file.canonicalPath,
bitmap.width,
bitmap.height,
HeifWriter.INPUT_MODE_BITMAP
)
.setQuality(quality)
.build().apply {
start()
addBitmap(bitmap)
stop(0)
close()
}
file.length()
}
}
private fun readBitmapAsset(assetName: String): Bitmap {
return context.assets.open(assetName).use { inputStream ->
BitmapFactory.decodeStream(inputStream)
}
}
雖然在我們到達之前可能覺得我們不應(yīng)該使用HEIF圖像厌杜,但minSdkVersion = 29實際上我們可以在此之前獲益奉呛。如果您正在使用Android應(yīng)用程序包,并且正在使用Play商店中的動態(tài)傳送夯尽,那么在您的res/drawables-*-v29文件夾中包含HEIF圖像將允許動態(tài)傳送以將APK中的HEIF圖像捆綁到Q和更高版本的設(shè)備中瞧壮,因此從開始將會帶來實實在在的好處現(xiàn)在包括在內(nèi)。隨著具有HEIF功能的設(shè)備數(shù)量的增加匙握,這些優(yōu)勢將隨著時間的推移而增加咆槽。
為了了解HEIF如何與JPEG進行比較,此帖子的示例應(yīng)用程序讀取圖像并將其保存為JPEG和HEIF圖像圈纺,以確保我們進行比較秦忿,因為兩個圖像都是由Android框架圖像生成的編解碼器。JPEG和HEIF使用它們使用有損壓縮算法quality值蛾娶,以確定如何壓縮實際上有損是灯谣。兩者的質(zhì)量都是100,實際上是無損壓縮蛔琅。
該應(yīng)用程序具有SeekBar允許將不同的質(zhì)量值應(yīng)用于圖像轉(zhuǎn)換的應(yīng)用程序胎许。在無損壓縮(質(zhì)量= 100)時,HEIF圖像(頂部一個)是3.72 MB罗售,而JPEG一個(底部一個)是5.85 MB辜窑。這非常接近半尺寸聲明,我看不出圖像質(zhì)量有任何差異 - 但是如果壓縮真的是無損的話應(yīng)該不會有:
事情可能會讓人感到困惑的是中等質(zhì)量的價值觀寨躁。JPEG圖像尺寸急劇下降穆碎,而HEIF尺寸則逐漸減小。請記住职恳,這不是真正的相似比較所禀,因為質(zhì)量值對于不同的壓縮算法意味著不同的東西。
在quality = 25
我可以清楚地看到JPEG圖像中出現(xiàn)一些文物话肖,而HEIF圖像看起來仍然很好 - 如果不是比JPEG圖像更好quality = 50
北秽。
如果我們將quality = 25
上圖中的JPEG 與下圖中的HEIF 進行比較,則會更有趣quality = 15
最筒。文件大小相當(dāng)贺氓,JPEG quality = 25
為814 kB,HEIF quality = 15
為891 kB。
然而辙培,HEIF的質(zhì)量要好得多蔑水。雖然有些文物開始出現(xiàn),但它們遠不如JPEG圖像那樣明顯quality = 25
扬蕊。因此搀别,HEIF的質(zhì)量可以設(shè)置得比JPEG低得多,以在較小的圖像尺寸下獲得更好的質(zhì)量尾抑。
只是把事情發(fā)揮到極致歇父,就在質(zhì)量標(biāo)準(zhǔn)的最底端,我們看到了一些真正的差異:
HEIF圖像的大小是JPEG圖像的三分之一再愈,但質(zhì)量要好得多榜苫。JPEG圖像既是分色的又是塊狀的,而HEIF只是塊狀的翎冲。雖然兩者都不是很好垂睬,我真的不想實際使用它們中的任何一個,但HEIF的質(zhì)量明顯優(yōu)于JPEG抗悍,而其尺寸僅為其三分之一驹饺。
正如我之前提到的,我們無法直接比較質(zhì)量值缴渊,而是應(yīng)該查看任何給定質(zhì)量值的圖像質(zhì)量赏壹。對于無損壓縮,HEIF獲勝疟暖,但我們可以使用低得多的質(zhì)量值卡儒,HEIF仍可實現(xiàn)高水平壓縮,同時仍保持良好的圖像質(zhì)量俐巴。
值得指出的是骨望,不同的圖像會有不同的壓縮,所以我在這里所做的結(jié)果遠非確鑿的證據(jù)欣舵。也就是說擎鸠,在這種情況下使用HEIF可以獲得明顯的尺寸/質(zhì)量優(yōu)勢。而且我完全期望將趨勢擴展到其他圖像缘圈,到目前為止我對HEIF的體驗傾向于支持這種觀點劣光。
ps: 最后還有個HEIF、AVIF糟把、JPEG和WebP圖像對比網(wǎng)站僅供參考
https://compare.rokka.io/_compare/