背景

最近在工作中会遇到需要将 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图片相关推荐

  1. 如何将夜晚图片转化为白天图片 matlab,教你简单几步将白天图片转换成夜景图_资源库...

    摘要:教你简单几步将白天图片转换成夜景图_资源库 摘要:今天分享一个有趣的教程,教大家利用滤镜和调整图层,简单几步将白天图片变成夜景图,特别实用,还能学到一个鲜为人知的调色功能,看看赶紧练练吧. 原图 ...

  2. python将图片转换成动漫_如何把照片变成手绘动漫化?

    12/10更新送福利 知乎专供,虎课网7天全站通VIP,全站5w+视频教程随意看!(当然也包括回答中的所有视频链接) ============================== 一.用电脑PS做 点 ...

  3. xsd文件转图片_图片转换成PDF格式怎么转?图片转换成PDF的软件哪个好?

    图片转换成PDF格式怎么转?经验丰富的设计师在完成图片格式的设计作品后都会将图片转成PDF格式文件,这样方便保存以及参加一些设计比赛.同时我们在保存大量图片的时候也可以将图片转换成PDF文件.但是还有 ...

  4. 海思AI芯片(Hi3519A/3559A)方案学习(十四)JPEG图片转换成bgr文件

    原文:https://blog.csdn.net/avideointerfaces/article/details/89931156 前言 在系列文章海思AI芯片(Hi3519A/3559A)方案学习 ...

  5. html视频怎么转换成图片,WPS演示如何将图片转换成视频?

    将图片转换成视频你是这么做的呢?WPS演示如何将图片转换成视频?现在的人们对于会动的事物都充满着好奇,就连好看的图片也需要转换成视频了.利用WPS演示,将图片转化成视频.本质上就是制作一个PPT文档, ...

  6. Flutter: 把本地相册图片转换成Base64的方法

    前言 在Flutter开发中,关于图片上传和展示也是常用必用的操作,尤其是在设置APP用户的头像信息,以及上传背景图的操作.关于Flutter开发中图片的上传和展示也是比较常用的操作,也有对应的组件和 ...

  7. 【把图片制作成电子书】名编辑电子杂志大师教程 | 导入图片转换成电子杂志

    下面就给您介绍下如何在名编辑中导入图片转换成电子杂志 第一步:首先要整理好您需要导入的图片,并且都放到一个文件夹里面. 图片的大小都调整好,并且全部都调整成同样的高度和宽度. 另外需要注意的是,图片越 ...

  8. js将图片转换成base64

    之前有个需求是把页面绘制成图片,上传到服务器中,我使用的 html2canvas .但是html页面当中含有图片,如果图片地址非本页面域名,在截图时就会存在跨域问题,导致截图失败.经过多方查找,发现把 ...

  9. base64转html文件,图片转换成Base64编码集成到html文件

    首先为什么要这么做?  原因很简单这样可以减少与服务器的请求,当然对于一些浏览器并不支持,如IE8.通常用在手机版网站中,具体转化方法如下: 1.在线打开Base64的编码器将图片编码成Base64 ...

  10. java png 转jpg_怎么用java将png图片转换成jpg格式的图片

    png是一种背景透明格式的图片,大量用于网络上,保真性很好,JPG是压缩图片,占用空间少.但有一些失真,所以在将png图片转换成jpg图片之后,肯定是有一些差异的,毕竟这是两种不同的格式. 下面用一个 ...

最新文章

  1. javascript 事件冒泡 和 冒泡事件阻止
  2. tpopela/vips_java
  3. many-to-many
  4. OTA固件升级对于物联网设备的重要性
  5. Android mediaRecorder框架简述(一)
  6. 移动端H5页面注意事项
  7. 韩顺平php视频笔记72-74 面向对象编程的三大特征3 重载override与重写overload 魔术常量
  8. matlab常用函数通俗解释(fft2和fftshift函数设置问题等)
  9. Sep 12.1.4112.4156部署客户端
  10. softmax 惩罚函数推到过程 转载
  11. 单片机开发怎么把杜邦线弄整齐?
  12. OS学习笔记-5(清华大学慕课)计算机体系结构与内存层次
  13. Office2016零售版(Retail)转批量授权(VOL)
  14. 给正在转行互联网朋友们的一封信
  15. AC框架与DQN在《只狼》以及《黑暗之魂》中的应用
  16. 通用 Mapper 4.0.0 版本发布
  17. 手把手教你 Tableau 绘制凹凸图(二十八)
  18. java 线程 异常中断_java多线程并发之旅-19-InterruptedException 中断异常处理及中断机制...
  19. VMware虚拟机显示网络电缆已拔出
  20. m基于基站休眠的LTE-A异构网络中节能算法matlab仿真

热门文章

  1. delete和delete[]的区别
  2. maven install出错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (d
  3. springboot入门程序
  4. leetcode 328. Odd Even Linked List | 328. 奇偶链表(Java)
  5. Jquery中的$(document).ready()详解
  6. PAT1049 数列的片段和 (20 分)
  7. 牛客网_PAT乙级_1028到底买不买(20)【用iterator迭代器,对两个vectorchar比较,删除相同元素】
  8. SpringBoot @ConfigurationProperties详解
  9. Linux服务器后台运行jar包
  10. 21行代码AC_ 试题H: 修改数组【解题报告】