Python模块(3)--PIL 简易使用教程

PIL模块-用与记

  • 1.图片导入Image.open()
  • 2.图像显示.show()
  • 4.查看图片属性.format,.size,.mode
  • 3.图像格式转换.convert()
  • 4.图像模式“L”,“RGB”,"CYMK"
  • 5. 图片旋转.rotate()
    • 旋转方式1:旋转不扩展
    • 旋转方式2:旋转扩展
    • 旋转方式3:旋转,扩展,白色填充
  • 6.图片切割.crop()
  • 7.图片保存.save()

PIL:Python Imaging Library,为Python图像处理常用的库。

PIL手册网站:http://effbot.org/imagingbook/pil-index.htm
PIL库中最重要的一个类:Image,可以通过这个类/模块 导入图像,处理图像,保存图像

import Image

1.图片导入Image.open()

img=Image.open(“xxx/xxx/lena.jpg”)

导入路径中的文件名后要带扩展名,不然会报一下错误:

IOError: [Errno 2] No such file or directory: ‘lena’

2.图像显示.show()

img.show()

在这里插入图片描述

4.查看图片属性.format,.size,.mode

图片源格式,图片尺寸,图片模式

print(img.format , img.size , img.mode)

输出

(‘JPEG’, (200, 200), ‘RGB’)

3.图像格式转换.convert()

img.convert('L")
img.show()

在这里插入图片描述
mode 从"RGB" 转变成"L"

4.图像模式“L”,“RGB”,“CYMK”

PIL中的图像有一下9种模式,使用.convert()函数,可以让图片在这9中模式中来回转换。(作为参数,模式要加引号)
· 1 (1-bit pixels, black and white, stored with one pixel per byte)
· L (8-bit pixels, black and white) # 灰度
· P (8-bit pixels, mapped to any other mode using a colour palette)
· RGB (3x8-bit pixels, true colour) # 彩色
· RGBA (4x8-bit pixels, true colour with transparency mask)
· CMYK (4x8-bit pixels, colour separation)
· YCbCr (3x8-bit pixels, colour video format)
· I (32-bit signed integer pixels)
· F (32-bit floating point pixels)
参考资料:https://www.cnblogs.com/shangpolu/p/8041848.html

5. 图片旋转.rotate()

旋转方式1:旋转不扩展

#在原图上旋转,旋转后的图像与原图大小一致,转出图像的部分会被丢弃,所以会造成信息丢失
img2=img.rotate(45)

在这里插入图片描述

旋转方式2:旋转扩展

#旋转后扩展,信息不丢失,图像尺寸变大
img3=img.rotate(45,expand=True)

在这里插入图片描述)

旋转方式3:旋转,扩展,白色填充

img_alpha=img.convert("RGBA")  # 将原图转换成RGBA的格式,四个通道,另一个通道表示透明度,默认为255,完全不透明
rot = img_alpha.rotate(45, expand = True) # 旋转图片fff=Image.new("RGBA",rot.size,(255,255,255,255))
out=Image.composite(rot,fff,mask=rot)
out.convert(img.mode).show()
# RGBA模式需要转换成RGB,才能存储,不然会报错

在这里插入图片描述

参考资料:https://blog.csdn.net/luolinll1212/article/details/83059118

6.图片切割.crop()

box = (0, 0, 100, 150) #切割区域的四个坐标(left,top,right,bottom) 
region = img.crop(box)

在这里插入图片描述

PIL 图像坐标系以图像的左上角为(0,0)位置,第一维度为长,第二维度为高。

7.图片保存.save()

img.save("…/testdir/img.jpg")

如果文件目录不存在,就会报错

FileNotFoundError: [Errno 2] No such file or directory: ‘…/testdir/img.jpg’

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

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

相关文章

输入输出系统

I/O设备:输入输出和存储功能的设备 I/O设备的分类 按传输的速度: 低速设备(如键盘、鼠标、语音输入输出设备) 中速设备(如行式打印机、激光打印机等) 高速设备(如磁带机、磁盘机、光盘机等&…

模拟银行家算法

介绍 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define RESOURCE_NUM …

js知识点汇总

1.本门课的作用&#xff08;JavaScript的作用&#xff09;所有基于Web的程序开发基础 2.一种计算机客户端脚本语言&#xff0c;主要在Web浏览器解释执行。 3.浏览器中Javascript&#xff0c;用于与用户交互&#xff0c;以及实现页面中各种动态特效 4.在HTML文件中&#xff0…

关于Java中String的问题

String 对象的两种创建方式&#xff1a; String str1 "abcd";//先检查字符串常量池中有没有"abcd"&#xff0c;如果字符串常量池中没有&#xff0c;则创建一个&#xff0c;然后 str1 指向字符串常量池中的对象&#xff0c;如果有&#xff0c;则直接将 st…

如何判断对象已经死亡

引用计数 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单&#xff0c;效率高&#xff0c;但是目前主流…

算法(2)-二叉树的遍历(递归/迭代)python实现

二叉树的遍历1.深度优先DFS1.1 DFS 递归解法1.1.1先序遍历1.1.2中序遍历1.1.3后序遍历1.2 DFS迭代解法1.2.1先序遍历1.2.2中序遍历1.2.3后序遍历2.广度优先BFS3.二叉树的最大深度3.1递归3.2迭代4.翻转二叉树4.1递归4.1迭代5.合并两棵二叉树5.1递归5.2迭代有两种通用的遍历树的策…

利用posix_fadvise清理系统中的文件缓存

利用posix_fadvise清理系统中的文件缓存leoncom c/c,unix2011-08-03当我们需要对某段读写文件并进行处理的程序进行性能测试时&#xff0c;文件会被系统cache住从而影响I/O的效率&#xff0c;必须清理cache中的对应文件的才能正确的进行性能测试。通常清理内存可以采用下面的这…

空间分配

目前主流的垃圾收集器都会采用分代回收算法&#xff0c;因此需要将堆内存分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 大多数情况下&#xff0c;对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时&#xff0c;虚拟…

创建与打开IPC通道的POSIX和SYSTEM V方法

先说&#xff30;&#xff2f;&#xff33;&#xff29;&#xff38;的吧&#xff1a; mq_open&#xff0c;sem_open&#xff0c;shm_open着三个函数用于创建或者打开一个IPC通道。 由此可见&#xff0c;消息队列的读写权限是任意的&#xff0c;然而信号灯就没有&#xff0c;…

软件测试基础知识

第一章 1.1 软件测试背景知识和发展史 互联网公司职位架构&#xff1a;产品 运营 技术 市场 行政软件测试&#xff1a;使用人工或自动化手段&#xff0c;来运行或测试某个系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别&#…

Jmeter-基础篇

常用压力测试工具对比 1、loadrunner 性能稳定&#xff0c;压测结果及细粒度大&#xff0c;可以自定义脚本进行压测&#xff0c;但是太过于重大&#xff0c;功能比较繁多 2、apache ab(单接口压测最方便) 模拟多线程并发请求,ab命令对发出负载的计算机…

shell一文入门通

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了&#xff01;下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。 (1)新建一个文件…

RPC编程

图 3 说明在客户机和服务器之间完成 RPC 涉及的步骤。 图 3. 在客户机和服务器之间完成 RPC 涉及的步骤服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口。需要注册接口是因为&#xff0c;客户机在向服务器发出远程过程调用时&#xff0c;要检查它是否与服务器兼容。…

synchronized使用和原理全解

synchronized是Java中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 修饰一个方法 被修饰的方法称为同步方法&#xff0c;其作用的范围是整个方法&#xff0c;作用的对象是调用这个方法的对象&#xff1b; 修饰一个静态的方法 其作用的范围是整个…

算法(11)-leetcode-explore-learn-数据结构-链表的经典问题

leetcode-explore-learn-数据结构-链表31.反转一个链表2.移除链表元素3.奇偶链表4.回文链表5.小结本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-l…

Linux线程池的设计

我设计这个线程池的初衷是为了与socket对接的。线程池的实现千变万化&#xff0c;我得这个并不一定是最好的&#xff0c;但却是否和我心目中需求模型的。现把部分设计思路和代码贴出&#xff0c;以期抛砖引玉。个人比较喜欢搞开源&#xff0c;所以大家如果觉得有什么需要改善的…

leetcode121买卖股票的最佳时机

给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易&#xff08;即买入和卖出一支股票&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,…

epoll的内核实现

epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); select/poll的缺点在于&#xff1…

leetcode322 零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 示例 1: 输入: coins [1, 2, 5], amount 11 输出: 3 解释: 11 5 5 1 示例 2: 输入: coins [2],…

leetcode538 把二叉搜索树转换成累加树

给定一个二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;把它转换成为累加树&#xff08;Greater Tree)&#xff0c;使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 对于每一个点来说&#xff0c;自己的父&#xff0c;和自己父的右子树都是大…