每日一学:如何转换png图片为jpg图片

PNG转JPG实战
本文介绍了一种将PNG图片转换为JPG格式的有效方法,旨在减少存储空间需求。通过使用Pillow库,我们展示了如何去除PNG图片的Alpha通道并转换为JPG,同时保持图片质量。实践案例显示,转换后的JPG图片大小显著减小。

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”

总第 128 篇文章,本文大约 800 字,阅读大约需要 3 分钟

背景

最近在工作中会遇到需要将 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 Image
im = 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 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')

下面给出一个代码例子:

首先是导入需要的库:

import os
from PIL import Image
%matplotlib inline
import 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)

开始转换:

# 转 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)

保存图片:

img_jpg.save('plane.jpg')

代码输出结果如下所示:

通过这种操作,原本是 128kb 的 png 图片转换为 38kb 左右的 jpg 图片,减少了接近 4 倍的存储空间,如下所示:

所以如果对图片质量要求不高,可以接受一定的质量损失,可以将图片保存为 jpg 格式进行保存,这样可以保存更多数量的图片。

参考:

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

小结

这只是一种解决 png 转换为 jpg 图片的方法,是从采用 Pillow 库的代码实现方法,如果是采用其他的图片库,比如 opencv 等,也有相应的解决方法,这里大家可以自己探索一下,网上应该也是有相应的解决方法的。


精选AI文章

1. 10个实用的机器学习建议

2. 深度学习算法简要综述(上)

3. 深度学习算法简要综述(上)

4. 常见的数据增强项目和论文介绍

5. 实战|手把手教你训练一个基于Keras的多标签图像分类器

精选python文章

1. Python 基础入门--简介和环境配置

2. python版代码整洁之道

3. 快速入门 Jupyter notebook

4. Jupyter 进阶教程

5. 10个高效的pandas技巧

精选教程资源文章

1. [资源分享] TensorFlow 官方中文版教程来了

2. [资源]推荐一些Python书籍和教程,入门和进阶的都有!

3. [Github项目推荐] 推荐三个助你更好利用Github的工具

4. Github上的各大高校资料以及国外公开课视频

5. GitHub上有哪些比较好的计算机视觉/机器视觉的项目?

欢迎关注我的微信公众号--算法猿的成长,或者扫描下方的二维码,大家一起交流,学习和进步!

 

如果觉得不错,在看、转发就是对小编的一个支持!

10天图像压缩技术实习计划 第1天:图像压缩基础与OpenCV入门 理论习:图像压缩原理(冗余类型、有损/无损压缩)及JPEG/PNG格式对比 实践操作:安装OpenCV/PIL库,实现图像加载/保存,测试不同格式的压缩效果 结果分析:对比BMP/JPEG/PNG的文件大小差异 第2天:空间域压缩实践 理论习:下采样原理与分辨率调整策略 实践操作:用OpenCV实现双线性插值降采样(1/2, 1/4, 1/8) 结果分析:观察分辨率降低对图像清晰度的影响 第3天:频域压缩技术基础 理论习:DCT变换原理及其在JPEG中的应用 实践操作:实现8×8块DCT变换,可视化频率分量分布 结果分析:验证能量集中于低频系数的特性 第4天:量化过程实现 理论习:量化表设计原理与压缩率控制 实践操作:实现自定义量化步长的系数量化 结果分析:对比不同量化步长(5/20/50)的重建图像质量 第5天:熵编码实现 理论习:哈夫曼编码与行程编码原理 实践操作:用Python实现DCT系数的哈夫曼编码 结果分析:计算压缩比提升效果(原数据vs编码后) 第6天:JPEG全流程实现 实践操作:整合DCT+量化+编码完成简易JPEG压缩 结果分析:测试不同质量参数(20/50/80)的压缩效果 新技术:了解WebP/HEIC等现代压缩格式 第7天:质量评估体系 理论习:PSNR/SSIM指标原理及数表达 实践操作:用OpenCV计算不同压缩图像的PSNR/SSIM 结果分析:绘制压缩率-质量指标关系曲线图 第8天:压缩故障分析 实践操作:极端压缩测试(质量系数<10) 结果分析:观察块效应、振铃效应等失真现象 解决方案:设计消除块效应的后处理方法 第9天:图像超分辨率重建 理论习:插值法(双三次/Lanczos)与SRCNN模型原理 实践操作:实现双三次插值重建,测试预训练ESPCN模型 结果分析:对比传统方法与深度习的重建效果(SSIM指标) 第10天:场景化压缩策略 综合实验:针对不同场景(医疗CT/社交图片/监控视频)设计压缩方案 参数调优:平衡压缩率与质量的最佳实践 成果总结:完成综合报告,提出场景优化建议表 每日实习成果示例: 第3天成果:DCT变换可视化图中可清晰观察到左上角低频区域能量集中 第6天成果:质量参数50时实现10:1压缩比,SSIM保持0.92以上 第9天成果:ESPCN模型较双三次插值PSNR提升3.2dB 该实习计划由浅入深覆盖核心技术点,通过: 基础认知(1-3天)→ 核心算法实现(4-6天)→ 质量评估(7天)→ 重建技术(8-9天)→ 综合应用(10天) 的渐进路径,确保在10天内系统掌握图像压缩技术全流程。每日实验设计均包含参数对比环节,强化对“压缩率-质量”平衡关系的理解。根据这个实训内容写出最终的python代码
最新发布
06-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spearhead_cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值