Python学习之批量转换图片格式和统一图片尺寸

news2024/11/21 0:16:29

前言

大家在工作的时候是不是都会接触到很多的图片,为了满足不同的需求:

兼容性:不同设备和应用程序可能支持不同的图片格式。通过转换图片格式,可以确保在各种设备和应用程序中都能够正确地显示图片。

文件大小:不同的图片格式具有不同的文件大小。有时候,将图片从一种格式转换为另一种格式可以显著减小文件大小,这有助于在网络上更快地加载图片。

质量:有些图片格式对于特定类型的图像效果更好。通过转换图片格式,可以选择更适合特定图像的格式,从而提高图像质量。

编辑能力:不同的图片格式支持不同的编辑功能。通过将图片转换为支持所需编辑功能的格式,可以更轻松地进行编辑工作。

如果我们需要把图片转换成文件,用Python学习的知识是不是能实现呢?
在这里插入图片描述

Python模块之Image的应用示例

  1. 首先需要导入需要的图像库:

import Image

  1. 读取一张图片:

im=Image.open(‘/home/Picture/test.jpg’)

  1. 显示一张图片:

im.show()

  1. 保存图片:

im.save(“save.gif”,“GIF”) #保存图像为gif格式

  1. 创建新图片:

Image.new(mode,size)

Image.new(mode,size,color)

栗子:newImg = Image.new(“RGBA”,(640,480),(0,255,0))

newImg.save(“newImg.png”,“PNG”)

6.两张图片相加:

Image.blend(img1,img2,alpha) # 这里alpha表示img1和img2的比例参数

  1. 点操作:

im.point(function) #,这个function接受一个参数,且对图片中的每一个点执行这个函数

比如:out=im.point(lambdai:i*1.5)#对每个点进行50%的加强

  1. 查看图像信息:

im.format, im.size, im.mode

  1. 图片裁剪:

box=(100,100,500,500)

#设置要裁剪的区域

region=im.crop(box) #此时,region是一个新的图像对象。

  1. 图像黏贴(合并)

im.paste(region,box)#粘贴box大小的region到原先的图片对象中。

  1. 通道分离:

r,g,b=im.split()#分割成三个通道,此时r,g,b分别为三个图像对象。

  1. 通道合并:

im=Image.merge(“RGB”,(b,g,r))#将b,r两个通道进行翻转。

  1. 改变图像的大小:

out=img.resize((128,128))#resize成128*128像素大小

  1. 旋转图像:

out=img.rotate(45) #逆时针旋转45度

有更方便的:

region = region.transpose(Image.ROTATE_180)

  1. 图像转换:

out = im.transpose(Image.FLIP_LEFT_RIGHT)

#左右对换。

out = im.transpose(Image.FLIP_TOP_BOTTOM)

#上下对换

  1. 图像类型转换:

im=im.convert(“RGBA”)

  1. 获取某个像素位置的值:

im.getpixel((4,4))

  1. 写某个像素位置的值:

img.putpixel((4,4),(255,0,0))

图片批量转换和尺寸调整代码示例

'''
  图片格式批量转换
'''
def istype(filetype):
    '''
    判断是否为图片文件
    :param filetype: 文件扩展名
    :return: 是,返回True,不是,返回False
    '''
    filetype = filetype.lower() # 扩展名转换为小写
    # 判断是否为图片格式
    if filetype == '.jpg' or filetype=='.jpeg' or filetype=='.png' or filetype=='.gif' or filetype=='.bmp' or filetype=='.tif':
        return True # 返回True
    else:
        return False

def thumpic(filepath, width, height):
    try:

        image = Image.open(filepath) # 打开图片文件
        # 按指定大小对图片进行缩放(不一定完全按照设置的宽度和高度,而是按比例缩放到最接近的大小)
        image.thumbnail((width, height))
        # 下面的方法会以严格按指定大小对图片进行缩放,但可能会失真
        # image = image.resize((width, height))
        image.save(filepath) # 保存缩放后的图片
        # print('图片处理完成……')
        # os.startfile(path) # 打开指定路径进行预览
    except Exception as e:
        print(e)
        
import os
from PIL import Image
while True:
    oldpath = input('请输入要转换格式的图片路径:')
    newpath = input('请输入转换格式后的图片保存路径:')
    flag = int(input('''要转换的格式:
1、jpg  2、jpeg  3、png  4、gif  5、bmp  6、tif
请选择:'''))
    width=int(input('请输入宽度限制:'))
    height=int(input('请输入高度限制:'))
    list = os.listdir(oldpath)  # 遍历选择的文件夹
    for i in range(0, len(list)):  # 遍历文件列表
        filepath = os.path.join(oldpath, list[i])  # 记录遍历到的文件名
        if os.path.isfile(filepath):  # 判断是否为文件
            filename= os.path.splitext(list[i])[0]  # 获取文件名
            filetype = os.path.splitext(list[i])[1]  # 获取扩展名
            if istype(filetype):  # 判断是否为图片文件
                img = Image.open(filepath)  # 打开图片文件
                # 根据选择的格式转换图片,并保存
                if flag == 1:
                    img=img.convert('RGB') # 将图片转换为RGB格式,因为jpg格式不支持透明度
                    img.save(os.path.join(newpath,filename+'.jpg'),'jpeg')
                    thumpic(os.path.join(newpath,filename+'.jpg'), width, height)
                elif flag == 2:
                    img = img.convert('RGB')
                    img.save(os.path.join(newpath, filename + '.jpeg'),'jpeg')
                    thumpic(os.path.join(newpath,filename+'.jpeg'), width, height)
                elif flag == 3:
                    img.save(os.path.join(newpath, filename + '.png'),'png')
                    thumpic(os.path.join(newpath,filename+'.png'), width, height)
                elif flag == 4:
                    img.save(os.path.join(newpath, filename + '.gif'),'gif')
                    thumpic(os.path.join(newpath,filename+'.gif'), width, height)
                elif flag == 5:
                    img.save(os.path.join(newpath, filename + '.bmp'),'bmp')
                    thumpic(os.path.join(newpath,filename+'.bmp'), width, height)
                elif flag == 6:
                    img.save(os.path.join(newpath, filename + '.tif'), 'tiff')
                    thumpic(os.path.join(newpath,filename+'.tif'), width, height)
    os.startfile(newpath)
    
    print('格式转换完成……')

在这里插入图片描述

最后

文章中对Python代码批量转换图片格式和尺寸的问题做了详细的代码示例和注释说明,希望对看到的小伙伴有帮助。

之前的文章中有对图片添加水印的代码示例,也可以多学习借鉴哦。

Python代码学习之给图片添加文字或图片水印

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

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

相关文章

基于matlab 从接收脉冲中提取波形参数

一、前言 现代飞机通常随身携带雷达警告接收器 (RWR)。RWR检测到雷达发射,并在雷达信号照射到飞机上时警告飞行员。RWR不仅可以检测雷达发射,还可以分析截获的信号并编目信号来自哪种雷达。此示例显示了 RWR 如何估计截获脉冲的参…

10倍速度开发贪吃蛇游戏之AI辅助

今天就来聊聊AI代码辅助神器,即便是零基础也能上手,因为实在是太强了,这以后叫程序员们怎么活啊!话不多说,直接上神器 我用的是cursor,其实目前AI辅助代码不止cursor,还有微软家的copilot X这个根植于gith…

JVM-01-JVM知识

1-JVM内存模型 Java开发人员一般情况下,使用过程中,不用关注内存的申请和释放,得益于JVM自动内存分配机制,但是其实是个双刃剑,这可以提升Java开发的效率,但是弱化了开发人员内存管理意识,系统容…

四元数快速入门【Quaternion】

四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …

U盘在电脑上读不出来怎么办?详细解决方法在这!

案例:u盘在电脑上读不出来 【不知道为什么,我把u盘插入电脑后电脑完全读不出。我也不知道到底哪里出现了问题,有人可以帮我解答一下吗?】 U盘作为我们生活中经常使用的存储工具,其能帮我们存储大量的文件&#xff0c…

BM54-三数之和

题目 给出一个有n个元素的数组S,S中是否有元素a,b,c满足abc0?找出数组S中所有满足条件的三元组。 数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100。 空间复杂度:O(n^2),时间复杂度 O(n^2)。 注…

React 第三方插件 —— Cron 表达式生成器(qnn-react-cron)

qnn-react-cron 可以看做 react-cron-antd 的升级版(具体“渊源”可见文档),现有功能如下: 🎉 全面支持 cron:秒、分、时、日、月、周、年 🎉 日及周条件互斥,自动改变响应值 &…

8年测试开发,写给1-3年功能测试的几点建议,满满硬货指导

从15年毕业到现在也从业八年了,普通本科毕业,现在一家互联网公司担任测试部门总监,摸爬打滚,坑坑洼洼也经历了不少。思绪很久决定还是写下这篇,希望对后进的小伙子少走一点弯路。 很多人把职场想得太美好,其…

学node写接口!!!

fs 可以读取文档 fs.readFild() 用于读取文件 第一个参数 路径 第二个参数 "utf8"(默认值) 第三个参数 函数 function(err , dataStr ){ 第一个参数是错误, 第二个参数是正确的可以拿到读取文件里面的值 } fs.writeFile() 用于创建文件添加内容 …

【LeetCode中等】1419.数青蛙

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。…

如何根据参考文献查找原文及详细的文献信息

当我们已知参考文献想要查看下载原文以及相关信息时可以用下面的方法: 例如这篇参考文献:Alsamhi S H, Almalki F, Ma O, et al. Predictive estimation of optimal signal strength from drones over IoT frameworks in smart cities[J]. IEEE Transac…

FPGA实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

目录 1、前言2、我已有的SDI编解码方案3、我已有的PCIE方案4、总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通路 5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证SDI同步HDMI输出验证PCIE输出验…

neo4j结合gds实现最短路径算法

背景:Neo4j自带的cypher语句中的 shortestpath allShortestPaths 返回值内容非常有限,不易处理, 在实际生产环境中可用性极低, 且若带where条件查询时,查询效率极低 因此,使用Neo4j自带的插件如apoc来进行最短路径查询…

使用@Autowired、@Qualifier、@Primary注解自动装配组件

1.Autowired、Qualifier、Primary注解 1.1.Autowired注解 Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.ann…

hexo stellar主题添加运行时间-利用不蒜子

在网站的页脚想添加博客运行的时间以及,查了一下资料,根据下面的这个博主的代码进行了修改。 打造一个舒服的写作环境(Hexo) 下面我们开始修改: stellar/layout/_partial/main/footer.ejs 找到//footer的 这一段 // …

基于logback 实现springboot的日志配置

目录 一、前言 二、使用详解 2.1、打印到文件中 2.2、打印级别控制 2.3、logback 详细配置 2.4、logback 配置文件的组成 2.4.1、<root>标签 2.4.2、<contextName>标签 2.4.3、<property>标签 2.4.4、<appender>标签 2.4.5、<logger&g…

Mysql索引(2):索引结构

1 概述 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包含以下几种&#xff1a; 索引结构描述BTree索最常见的索引类型&#xff0c;大部分引擎都支持 B 树索引 Hash索引 底层数据结构是用哈希表实现的, 只有精确匹配索引列的…

ShardingProxy分库分表实战

目录 ShardingProxy简述 快速使用 ShardingProxy部署 ShardingProxy使用 ShardingProxy的服务治理 Shardingproxy的其他功能 ShardingProxy的SPI扩展 ShardingSphere总结 ShardingProxy简述 ShardingProxy的功能同样是分库分表&#xff0c;但是他是一个独立部署的服务…

林曦讲座 | 关于“无用之美”的11个闪光

林曦老师的新书《无用之美》即将和大家见面啦~    究竟什么是“无用之美”呢&#xff1f;早在2013年&#xff0c;林曦老师就曾在“一席”做过一场关于“无用之美”的分享。2019年又在微软做过一次《中国人的闲情逸致——无用之美》的演讲。这次将两次演讲的内容精华整理出来…

【LeetCode】14. 最长公共前缀

1. 问题 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2 输入&#xff1a;strs [“dog”,“racecar”,“car”] 输出…