c#如何wmf图片转换成png图片_每日一学:如何将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 模式的轉換:
from?PIL?import?Imageim?=?Image.open("test.png")bg?=?Image.new("RGB",?im.size,?(255,255,255))bg.paste(im,im)bg.save("test.jpg")然后是 RGBA 和 P 模式的轉換,其轉換方法也是一樣的:
from?PIL?import?Imageimg_pil?=?Image.open('test.png').convert('RGBA')x,?y?=?img_pil.sizep?=?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')下面給出一個代碼例子:
首先是導入需要的庫:
import?osfrom?PIL?import?Image%matplotlib?inlineimport?matplotlib.pyplot?as?plt接著讀取圖片:
#?原始的?png?圖片ori_img?=?'plane.png'#?讀取圖片img_png?=?Image.open(ori_img)print(img_png.mode,?img_png.size)plt.imshow(img_png)開始轉換:
#?轉?jpgimg_pil?=?img_png.convert('RGBA')x,?y?=?img_pil.sizeimg_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)保存圖片:
img_jpg.save('plane.jpg')代碼輸出結果如下所示:
通過這種操作,原本是 128kb 的 png 圖片轉換為 38kb 左右的 jpg 圖片,減少了接近 4 倍的存儲空間,如下所示:
所以如果對圖片質量要求不高,可以接受一定的質量損失,可以將圖片保存為 jpg 格式進行保存,這樣可以保存更多數量的圖片。
參考:
- http://www.voidcn.com/article/p-rbpllhah-btp.html
小結
這只是一種解決 png 轉換為 jpg 圖片的方法,是從采用 Pillow 庫的代碼實現方法,如果是采用其他的圖片庫,比如 opencv 等,也有相應的解決方法,這里大家可以自己探索一下,網上應該也是有相應的解決方法的。
總結
以上是生活随笔為你收集整理的c#如何wmf图片转换成png图片_每日一学:如何将png图片转换为jpg图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 液晶弹性自由能计算_自由能方法应用(一)
- 下一篇: 把一个人的特点写具体作文_部编版五年级下