每日一學:如何將png圖片轉換為jpg圖片

背景

最近在工作中會遇到需要將 png 圖片轉換為 jpg 圖片的需求,主要原因也是 png 圖片佔的空間太大,如果圖片數量上萬張,可能就需要十幾G的存儲空間,所以希望轉換為更小的 jpg 圖片。

當然,這裡並不是直接修改圖片後綴為 jpg 即可,這樣直接粗暴的轉換可能會對圖片質量有所損失,包括背景顏色會出現問題;

解決思路

實際上要將 png 圖片轉換為 jpg 格式的圖片,其實就是從 4 通道的 png 轉換為 3通道的 jpg 格式,也就是能保留原始的 RGB 三通道,只是去掉第四個通道的 alpha 通道,也就是我們需要將 RGB 通道的像素部分提取出來,然後貼到一個空白的新圖片上,再保存為 jpg 圖片即可。

代碼實現

這裡使用的是 Pillow 庫來進行轉換,然後這裡需要注意不同模式的圖片,處理方式還是有所不同的。

這裡簡單介紹,通過 Pillow 打開的圖片,有以下幾種模式:

  • 1:1位像素,表示黑和白,但是存儲的時候每個像素存儲為8bit。
  • L:8位像素,表示黑和白。
  • P:8位像素,使用調色板映射到其他模式。
  • RGB:3x8位像素,為真彩色。
  • RGBA:4x8位像素,有透明通道的真彩色。
  • CMYK:4x8位像素,顏色分離。
  • YCbCr:3x8位像素,彩色視頻格式。
  • I:32位整型像素。
  • F:32位浮點型像素。

通過 mode 即可查看圖片的模式。

這裡介紹比較常見的幾種模式轉換為 jpg 的方法,首先是 L 模式的轉換:

<code>from PIL import Image
im = Image.open("test.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("test.jpg")/<code>

然後是 RGBA 和 P 模式的轉換,其轉換方法也是一樣的:

<code>from PIL import Image
img_pil = Image.open('test.png').convert('RGBA')
x, y = img_pil.size
p = Image.new('RGBA', img_pil.size, (255, 255, 255))
p.paste(img_pil, (0, 0, x, y), img_pil)
p = p.convert("RGB")
p.save('test.jpg')/<code>

下面給出一個代碼例子:

首先是導入需要的庫:

<code>import os 

from PIL import Image
%matplotlib inline
import matplotlib.pyplot as plt/<code>

接著讀取圖片:

<code># 原始的 png 圖片
ori_img = 'plane.png'
# 讀取圖片
img_png = Image.open(ori_img)
print(img_png.mode, img_png.size)
plt.imshow(img_png)/<code>

開始轉換:

<code># 轉 jpg
img_pil = img_png.convert('RGBA')
x, y = img_pil.size
img_jpg = Image.new('RGBA', img_pil.size, (255, 255, 255))
img_jpg.paste(img_pil, (0, 0, x, y), img_pil)
img_jpg = img_jpg.convert("RGB")
print(img_jpg.mode, img_jpg.size)
plt.imshow(img_jpg)/<code>

保存圖片:

<code>img_jpg.save('plane.jpg')/<code>

代碼輸出結果如下所示:

每日一學:如何將png圖片轉換為jpg圖片

通過這種操作,原本是 128kb 的 png 圖片轉換為 38kb 左右的 jpg 圖片,減少了接近 4 倍的存儲空間,如下所示:

每日一學:如何將png圖片轉換為jpg圖片

每日一學:如何將png圖片轉換為jpg圖片

所以如果對圖片質量要求不高,可以接受一定的質量損失,可以將圖片保存為 jpg 格式進行保存,這樣可以保存更多數量的圖片。

參考:

  • http://www.voidcn.com/article/p-rbpllhah-btp.html

小結

這只是一種解決 png 轉換為 jpg 圖片的方法,是從採用 Pillow 庫的代碼實現方法,如果是採用其他的圖片庫,比如 opencv 等,也有相應的解決方法,這裡大家可以自己探索一下,網上應該也是有相應的解決方法的。


分享到:


相關文章: