介紹
BPG(Better Portable Graphics)是一種新的圖像格式。 其目的是在質量或文件大小成問題時替換JPEG圖像格式。 它的主要優點是:
- 壓縮比高。 對于類似的質量,文件比JPEG小得多。
- 大多數Web瀏覽器都支持小型Javascript解碼器(gzip壓縮大小:56 KB)。
- 基于HEVC開放視頻壓縮標準的子集。
- 支持與JPEG(灰度,YCbCr 4:2:0,4:2:2,4:4:4)相同的色度格式,以減少轉換過程中的損耗。 支持Alpha通道。 還支持RGB,YCgCo和CMYK顏色空間。
- 本機支持每通道8至14位,以獲得更高的動態范圍。
- 支持無損壓縮。
- 可以包括各種元數據(例如EXIF,ICC配置文件,XMP)。
- 動畫支持。
下載
以下存檔包含bpgenc,bpgdec和bpgview命令行實用程序(對于Linux)和關聯的libbpg庫(讀取存檔中的README文件)的源代碼。 它還包括Javascript解碼器的源代碼:
libbpg-0.9.8.tar.gz
Windows的二進制分發(僅限64位):
bpg-0.9.8-win64.zip
以下鏈接可以下載上述兩個工具:
非官方的Github鏡像。https://github.com/mirrorer/libbpg
對于Mac用戶,可以在libbpg Homebrew 公式中使用BPG實用程序。
參數介紹(可直接使用工具**bpg-0.9.8-win64.zip** )
1. 編碼
bpgenc -m 9 -b 8 -q 48 input.png -o output.bpg # -m 控制速度 -b 控制位深度 -q 控制圖像質量 -o 輸出圖像
BPG命令行編碼器是
'bpgenc'
。它需要JPEG或PNG圖像作為輸入。有以下幾個參數
-
速度:默認情況下,bpgenc使用x265。你可以編譯很多更慢但更高效的JCTVC編碼器,并使用’-ejctvc’選項選擇它。使用x265,您可以使用
'-m'
選項選擇編碼速度(1 =快速,但圖像較大,9 =較慢但圖像較小)。 -
位深度:默認位深度為8.您可以將其增加到10(
'-b 10'
選項)以略微提高壓縮比。對于Web發布,它通常不是一個好主意,因為Javascript解碼器使用更多內存。編譯后的x265編碼器支持8,10和12的位深度。通過啟用Makefile定義:USE_JCTVC_HIGH_BIT_DEPTH
,可以編譯較慢的JCTVC編碼器以支持更高的位深度(最多14位)。 -
通過HEVC無損功能支持無損壓縮作為獎勵。除非你知道你做了什么,否則在這種情況下使用PNG輸入!在JPEG輸入的情況下,壓縮與JPEG YCbCr數據無關,而與RGB數據無關。在任何情況下,位深度應與您的圖片匹配,否則文件大小會增加很多。默認情況下,無損模式將位深度設置為8位。首選顏色空間設置為“rgb”。筆記:
-
無損模式對損耗模式的測試較少,但它通常會在攝影圖像上提供更好的PNG結果。
-
JCTVC編碼器比具有無損壓縮的x265編碼器提供更小的圖像。
-
-
量化器的解釋存在細微差別x265和JCTVC編碼器之間的參數(
-q選項
)。 對于圖像壓縮這個參數是比較重要的,它控制圖像質量,取值范圍[1,51],數值越高壓縮率越大,圖像質量越差。 -
色彩空間和色度格式:
*對于JPEG輸入,不修改輸入圖像的色彩空間(YCbCr,RGB,YCbCrK或CMYK)。根據優選的色度格式(
'-f'
選項)對色度進行二次采樣。*對于PNG輸入,輸入圖像將轉換為首選顏色空間(
'-c'
選項)。然后根據優選的色度格式對其色度進行二次采樣。*灰度圖像保持不變。
-
預乘alpha:默認情況下,bpgenc使用非預乘alpha來保留顏色分量。然而,預乘alpha(
'-premul'
選項)通常以犧牲顏色分量的損失為代價提供更好的壓縮。如果未編輯圖像,則此丟失不是問題。 -
動畫:使用’-a’選項,動畫可以從一系列PNG或JPEG圖像編碼,索引從1或0.例如:
./ bpgenc -a anim%2d.png -fps 25 -loop 0 - o anim.bpg
2. 解碼
bpgdec -o output.jpg input.bpg
BPG命令行解碼器是
bpgdec
。 它輸出PNG或PPM圖像。 使用PPM輸出以獲得最快的速度。
-
使用
'-i'
選項,您可以獲得有關BPG圖像的信息(并且不輸出解碼圖像)。 -
'-b'
選項選擇PNG輸出的位深度(8或16)。 它獨立于內部BPG位深度。
批量使用BPG
這里使用 os 庫 中的
system
操作來調用外部命令。這里需要將代碼
py文件
和
bpg-0.9.8-win64.zip
解壓后的文件在同一文件夾,否則運行命令的時候需要使用絕對路徑。
import
os
root_dir
=
'D:\\Colorization_Set_test\\test_gray'
for
item
in
os
.
listdir
(
root_dir
)
:
# 遍歷root_dir
name
=
root_dir
+
'\\'
+
item
# 獲取圖片路徑
save_dir
=
'D:\\Colorization_Set_test\\encode'
+
str
(
i
)
+
'_bpg\\'
# 存儲編碼結果
save_dir1
=
'D:\\Colorization_Set_test\\decode'
+
str
(
i
)
+
'_bpg\\'
# 存儲解碼結果
if
not
os
.
path
.
exists
(
save_dir
)
:
os
.
makedirs
(
save_dir
)
if
not
os
.
path
.
exists
(
save_dir1
)
:
os
.
makedirs
(
save_dir1
)
os
.
system
(
'bpgenc -m 9 -b 8 -q 40 '
+
name
+
' -o '
+
save_dir
+
item
.
split
(
'.'
)
[
0
]
+
'.bpg'
)
os
.
system
(
'bpgdec -o '
+
save_dir1
+
item
.
split
(
'.'
)
[
0
]
+
'.jpg'
+
' '
+
save_dir
+
item
.
split
(
'.'
)
[
0
]
+
'.bpg'
)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
