每日一学:如何转换png图片为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上有哪些比较好的计算机视觉/机器视觉的项目?

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react学习(30)---uncaught at check call: argument fn is undefined

出现这个报错是当前的dva.js的一个接口没有成功调用

lightoj 1020 (博弈水题)

lightoj 1020 A Childhood Game 链接:http://lightoj.com/volume_showproblem.php?problem1020 题意:一堆石子有 m 个,Alice和Bob可以从中取1个或者2个,如果Alice先取,最后取的人败;如果Bob先取&#xff0…

react学习(31)----react父传子

import React from react import Son from ./son class Father extends React.Component {constructor(props) {super(props)}state {info: 父组件,}handleChange (e) > {this.setState({info: e.target.value,})}render() {return (<div><input typetext value{…

python 数据模型

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 129 篇文章&#xff0c;本文大约 4500 字&#xff0c;阅读大约需要 15 分钟最近开始阅读《流畅的python》&#xff0c;也会开始更新这本书的学习笔记第一篇的内容是第一章 python 数…

Java基础之写文件——使用多个视图缓冲区(PrimesToFile2)

控制台程序。本例将对应于每个素数的数据以三个连续数据项的形式写入&#xff1a; 1、以二进制值表示的字符串长度值&#xff08;最好是整型&#xff0c;但本例使用double类型&#xff09;&#xff1b; 2、素数值的字符串表示”Primennn“&#xff0c;其中数字的位数明显是变化…

react学习(32)----onref

// 父组件 import React from react import Son from ./son import { Button } from antdclass Father extends React.Component {child: anyconstructor(props) {super(props)}sonRef (ref) > {this.child ref // 在这里拿到子组件的实例}clearSonInput () > {this.c…

每日一学:如何用matplotlib展示图片

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 130 篇文章&#xff0c;本文大约 1000 字&#xff0c;阅读大约需要 5 分钟前言今天简单介绍如何通过 matplotlib 展示图片&#xff0c;分为以下几种情况&#xff1a;直接用 matplotli…

Servlet 过滤器

一、过滤器介绍 在Servlet 2.3中定义了过滤器&#xff0c;它能够对Servlet容器的请求和响应进行检查和修改。 Servlet过滤器能够在Servlet被调用之前检查Request对象&#xff0c;并修改Request Header 和 Request内容。 Filter可以过滤Servlet&#xff0c;JSP&#xff0c;HTML。…

每日一学:如何读取网络图片

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 131 篇文章&#xff0c;本文大约 1300 字&#xff0c;阅读大约需要 3 分钟前言有时候我们需要读取的图片是网络上的图片&#xff0c;应该怎么操作呢&#xff1f;这里也是介绍两个常用…

Windows Phone 如何振动手机?

1. 导入命名空间。 using Windows.Phone.Devices.Notification; 2. 通过调用对 VibrationDevice 类的静态 GetDefault 方法获取对振动控制器的引用。 VibrationDevice vibrationDevice VibrationDevice.GetDefault(); 3. 通过调用 VibrationDevice 类的 Vibrate 方法开始振动。…

编写高效的PyTorch代码技巧(上)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 132 篇文章&#xff0c;本文大约 7000 字&#xff0c;阅读大约需要 20 分钟原文&#xff1a;https://github.com/vahidk/EffectivePyTorch作者&#xff1a;vahidk前言这是一份 PyTorc…

react学习(35)----getFieldDecorator will override value

我在自定义组件中定义了value值&#xff0c;getFieldDecorator会覆盖我们定义的值&#xff0c; 需要添加默认值可以使用在getFieldDecorator的时候&#xff0c;设置initialValue&#xff0c; 删除在自定义组件中定义的value就可以了&#xff01;

【ATT】Reverse Nodes in k-Group

ListNode* reverseBetween(ListNode* prev,ListNode* next)//reverse prev->next, last->prev之间的链表{ListNode* last prev->next;ListNode* cur last->next;while(cur!next){last->next cur->next;cur->next prev->next;prev->next cur;cu…

编写高效的PyTorch代码技巧(下)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 133 篇文章&#xff0c;本文大约 3000 字&#xff0c;阅读大约需要 15 分钟原文&#xff1a;https://github.com/vahidk/EffectivePyTorch作者&#xff1a;vahidk前言这是一份 PyTorc…

统计(1 - 2)

统计学基础定义 Statistics的前部分为“state”&#xff0c;政府&#xff0c;原由是统计是300年前被首次应用在政府部门统计人口出生和死亡信息的&#xff1b;如今的统计学早已被应用在各个专业领域&#xff1b; 统计学是用以收集数据、分析数据和数据推论的一组概念、原则和方…

2020年计算机视觉学习指南

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 134 篇文章&#xff0c;本文大约 3000 字&#xff0c;阅读大约需要 10 分钟原文&#xff1a;https://towardsdatascience.com/guide-to-learn-computer-vision-in-2020-36f19d92c934作…

是选择Keras还是PyTorch开始你的深度学习之旅呢?

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 135 篇文章&#xff0c;本文大约 7000 字&#xff0c;阅读大约需要 20 分钟原文&#xff1a;https://medium.com/karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0作者&#xff1…

关于myeclipse打开jsp巨慢解决方案

作为企业级开发最流行的工具&#xff0c;用Myeclipse开发java web程序无疑是最合适的&#xff0c;java web前端采用jsp来显示&#xff0c;myeclipse默认打开jsp的视图有卡顿的现象&#xff0c;那么如何更改jsp默认的打开方式&#xff0c;让我们可以进行更快速的jsp开发呢? 简单…

event

听取了网友:kenwang的意见,我的Blog在记流水账啊,现在才发现我发表的都是代码,一个感想也没有,以后要慢慢改正。明天要培训公司的框架&#xff0c;后天要搬家&#xff0c;这个周未没有得休息。