有关Python的小工具 - picture

  • 读取图片
    • 通过cv2.imread读取图片
    • 通过cv2.imread读取比特流
    • 通过Image.open读取图片
    • 通过io.BytesIO读取比特流
  • 保存图片
    • 通过cv2.imwrite保存图片
    • 通过imencode与base64.b64encode将图片保存为base64字符串
    • 通过Image.save保存图片
    • 通过base64.b64encode与base64.b64decode将图片保存为base64字符串
  • 获取图片大小
    • 通过cv2.shape获取图片大小
    • 通过Image.size获取图片大小
  • 修改图片大小
    • 通过cv2.resize修改图片大小
    • 通过Image.resize修改图片大小
  • 修改图片大小(进阶)等比缩放图片至指定大小范围
    • 通过cv2.resize缩放图片
    • 通过Image.resize放大图片
  • 旋转图片
    • 通过np.rot90直角旋转图片
    • 通过cv2.getRotationMatrix2D旋转图片
  • 翻转图片
    • 通过cv2.flip翻转图片
  • 后记

为了便于自己学习与记录,这里举例了常用的有关于Python对图片的各种操作。

读取图片

  1. 通过cv2.imread读取图片

    import cv2def study_cv2_read(path):"""通过路径加载图片:param path: 目标图片路径:return:"""image = cv2.imread(path)return imageif __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"img = study_cv2_read(img_path)
  2. 通过cv2.imread读取比特流

    import base64
    import cv2def study_cv2_read(byte64):"""将比特流加载为图片:param byte64: 图片的比特流:return:"""img_data = base64.b64decode(byte64)image = cv2.imdecode(np.fromstring(img_data, np.uint8), cv2.IMREAD_COLOR)return imageif __name__ == '__main__':img_byte64 = "图片比特流"img = study_cv2_read(img_byte64)
    
  3. 通过Image.open读取图片

    from PIL import Imagedef study_Image_open(path):"""通过路径加载图片:param path: 目标图片路径:return:"""image = Image.open(path)return imageif __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"img = study_Image_open(img_path)
  4. 通过io.BytesIO读取比特流

    import iofrom PIL import Imagedef study_Image_open(byte64):"""将比特流加载为图片:param byte64: 图片的比特流:return:"""img = io.BytesIO(byte64)image = Image.open(img)return imageif __name__ == '__main__':img_byte64 = "图片比特流"img = study_Image_open(img_byte64)

保存图片

  1. 通过cv2.imwrite保存图片

    import cv2def study_cv2_write(path, image):"""保存图片:param path: 目标路径:param image: 需要保存的图片:return:"""cv2.imwrite(path, image)if __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"img = cv2.imread(img_path)study_cv2_write("Python\\test.jpg", img)
  2. 通过imencode与base64.b64encode将图片保存为base64字符串

    import base64
    import cv2def study_cv2_to_byte64(img):"""将图片保存为base64字符串:param img: 需要转换的图片:return: 图片转换的base64字符串"""image = cv2.imencode('.jpg', img)[1]image_b64encode = str(base64.b64encode(image))[2:-1])return image_b64encodeif __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"img = cv2.imread(img_path)byte64 = study_cv2_to_byte64(img)
  3. 通过Image.save保存图片

    from PIL import Imagedef study_image_save(path, image):"""保存图片:param path: 目标路径:param image: 需要保存的图片:return:"""image.save(path)if __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"img = Image.open(img_path)study_image_save("Python\\test.jpg", img)
  4. 通过base64.b64encode与base64.b64decode将图片保存为base64字符串

    import base64
    import iofrom PIL import Imagedef study_image_to_byte64(path):"""将图片保存为base64字符串:param path: 需要转换图片路径:return: 图片转换的base64字符串"""image_file = open(path, 'rb')  # 二进制打开图片文件image_b64encode = base64.b64encode(image_file.read())  # base64编码image_file.close()  # 文件关闭image_b64decode = base64.b64decode(image_b64encode)  # base64解码return image_b64decodeif __name__ == '__main__':img_path = "Python\\Sakuya\\test.jpg"byte64 = study_image_to_byte64(img_path)

获取图片大小

  1. 通过cv2.shape获取图片大小

    import cv2def study_cv2_shape(image):"""获取图片大小:param image: 输入图片:return: 图片的宽,高"""image_height, image_width = image.shape[:2]return image_width, image_heightif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_width, img_height = study_cv2_shape(img)
  2. 通过Image.size获取图片大小

    from PIL import Imagedef study_image_size(image):"""获取图片大小:param image: 输入图片:return: 图片的宽,高"""image_size = image.sizeimg_width = image_size[0]img_height = image_size[1]return image_width, image_heightif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = Image.open(img_path)img_width, img_height = study_image_size(img)

修改图片大小

  1. 通过cv2.resize修改图片大小

    import cv2def study_cv2_resize(image, new_width, new_height):"""修改图片大小:param image: 原图片:param new_width: 新的图片宽度:param new_height: 新的图片高度:return: 缩放完的图片"""image_new_size = cv2.resize(image, (new_width, new_height))return image_new_sizeif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_resize = study_cv2_resize(img, 100, 100)

    使用cv2.resize可以任意修改图片大小,但是使用完之后,图片的像素点就已经被修改了,因此就会出现像素丢失等情况(如:缩小图片之后再放大回原本的像素大小,图片就会变得模糊)。

  2. 通过Image.resize修改图片大小

    from PIL import Imagedef study_image_resize(image, new_width, new_height):"""修改图片大小:param image: 原图片:param new_width: 新的图片宽度:param new_height: 新的图片高度:return: 缩放完的图片"""image_new_size = image.resize((new_width, new_height), Image.ANTIALIAS)return image_new_sizeif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = Image.open(img_path)img_resize = study_image_resize(img, 100, 100)

    同理,在缩小图片之后必然会出现像素丢失的情况,因此使用resize时需要谨慎处理。

修改图片大小(进阶)等比缩放图片至指定大小范围

缩放图片时,我们总会出现因为缩放时比例不对导致图片拉伸的情况,因此我们在处理图片时,可以获取一个比例narrow_size,然后将图片框高按比例缩放。

  1. 通过cv2.resize缩放图片

    import cv2def study_cv2_resize(image, target_size):"""等比缩放图片:param image: 原图片:param target_size: 需要缩放到的目标像素大小,缩放后的图片像素大小范围是根据这个值来决定的((target_size / 2) 到 (target_size * 2)):return: 缩放后的图片"""image_size = image.shapenew_width = image_width = image_size[1]new_height = image_height = image_size[0]# 选择宽高中间的一个值与target_size比较来决定图片的缩放,这里选择的是宽if image_width < target_size:narrow_size = target_size / image_widthif not narrow_size:new_width = image_width * new_width new_height = image_height * new_widthelse:narrow_size = image_width / target_size if not narrow_size:new_width = image_width / new_width new_height = image_height / new_widthimage_new_size = cv2.resize(image, (new_width, new_height))return image_new_sizeif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_resize = study_cv2_resize(img, 1000)
  2. 通过Image.resize放大图片

    from PIL import Imagedef study_image_resize(image, target_size):"""等比缩放图片:param image: 原图片:param target_size: 需要缩放到的目标像素大小,缩放后的图片像素大小范围是根据这个值来决定的((target_size / 2) 到 (target_size * 2)):return: 缩放后的图片"""new_width = image_width = image_size[0]new_height = image_height = image_size[1]new_width = img_width * narrow_sizenew_height = img_height * narrow_sizeimage_new_size = image.resize((new_width, new_height), Image.ANTIALIAS)return image_new_sizeif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = Image.open(img_path)img_resize = study_image_resize(img, 1000)

旋转图片

  1. 通过np.rot90直角旋转图片

    import cv2
    import numpy as npdef study_cv2_right_angle_rotate(image, right_angle_multiple=1):"""直角旋转图片旋转方向默认为逆时针np.rot90默认right_angle_multiple = 1:param image: 原图片:param right_angle_multiple: 需要旋转的直角倍数,一般为1, 2, 3, 4:return:"""if right_angle_multiple == 1:image_right_angle_rotate = np.rot90(image)else:image_right_angle_rotate = np.rot90(image, right_angle_multiple)return image_right_angle_rotateif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_rot90 = study_cv2_right_angle_rotate(img)img_rot270 = study_cv2_right_angle_rotate(img, 3)

    使用np.rot90固定为逆时针旋转,而且角度固定为90的倍数,如果需要顺时针旋转90度的图片,则就是相当于对图片逆时针进行了270度旋转,传入的参数为3。
    np.rot90函数默认是旋转90度的,也就是说,当你需要逆时针旋转90度的图片的时候,只需要调用np.rot90(img)就可以了,不需要在后面额外添加参数。

  2. 通过cv2.getRotationMatrix2D旋转图片

    import cv2
    import numpy as npdef study_cv2_angle_rotate(image, angle):"""任意角度旋转图片:param image::param angle::return:"""height, width = image.shape[:2]new_height = int(width * np.fabs(np.sin(np.radians(angle))) + height * np.fabs(np.cos(np.radians(angle))))new_width = int(height * np.fabs(np.sin(np.radians(angle))) + width * np.fabs(np.cos(np.radians(angle))))image_rotate = cv2.getRotationMatrix2D((width // 2, height // 2), angle, 1)image_rotate[0, 2] += (new_width - width) // 2image_rotate[1, 2] += (new_height - height) // 2new_image_rotate = cv2.warpAffine(image, image_rotate, (new_width, new_height))return new_image_rotateif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_rotate = study_cv2_angle_rotate(img, 3)

    如果只使用cv2.getRotationMatrix2D,在旋转之后,根据角度不同,很有可能会在边缘生成黑边。因此需要通过三角函数计算黑边的长度,然后在使用cv2.warpAffine获取新的图片,这时候就会将黑边裁剪掉。

翻转图片

  1. 通过cv2.flip翻转图片

    import cv2def study_cv2_flip(image, flip_type):"""翻转图片flip_type = 0时,图像垂直翻转flip_type = 1时,图像水平翻转flip_type = -1时,图像垂直与水平翻转:param image: 原图片:param flip_type: 翻转类型:return:"""image_flip = cv2.flip(image, flip_type)return image_flipif __name__ == '__main__':img_path = 'Python\\Sakuya\\test.jpg'img = cv2.imread(img_path)img_flip = study_cv2_flip(img, 0)

后记

这些代码都是分开写的,如何实现组合操作就不要再问了,自己根据情况合起来用就是了。
本文为学习用,便于自己忘记时候复习查阅,以后有啥新的知识点我还会加进来的。
至于为什么我所有文章的后记都一模一样,当然就是因为我懒啊!(bushi)

有关Python的小工具 - picture相关推荐

  1. 用Python编写小工具下载OSM路网数据

    文章来源于Python大数据分析,作者费弗里 本文对应脚本已上传至Github仓库: https://github.com/CNFeffery/DataScienceStudyNotes[1] 1 简 ...

  2. python 处理数据小工具_用Python这个小工具,一次性把论文作图与数据处理全部搞定!...

    原标题:用Python这个小工具,一次性把论文作图与数据处理全部搞定! 一入科研深似海-- 随着大学纷纷开学,"防脱发用生姜还是黑芝麻?", 研究僧们又开始为自己所剩无几的头发发愁 ...

  3. python自动翻译小工具_Python实现翻译小工具

    一.背景 利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面. 二.代码 git源码地址 Python实现翻 ...

  4. python 上传excel_简历批量合并Python+VBA小工具

    每年的校招,才是对招聘系统体验的真正大考. 如何帮HR快速标记.筛选成千上万的简历? 如何快速应答同学们的问询? 群面如何签到?如何自动分组? 怎样让候选人清楚面试流程与候场时间? 如何让面试官方便地 ...

  5. python趣味小工具,图片转Execl,图片转TXT工具

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. WHJWNAVY | 作者 Demo大师 | 来源 python 趣味实用 ...

  6. 如何用python写小工具_用python写一个录音小工具

    Python的paramiko,wxPython库的应用 Sound eXchange 命令行 需求 最近在给一个做语音识别的项目做QA工作.众所周知,此类人工智能方面的项目都需要一些数据收集的工作. ...

  7. 记Python开发小工具过程

    前言 因为压测一个系统,需要大量的id.网上找的工具一次最多生成500个,完全是杯水车薪了.就找了python生成的代码,修改成一次生成36万个,这次够用了.为了方便以后使用,就学习开发一个GUI界面 ...

  8. python小应用之整理手机图片_用Python这个小工具,一次性把论文作图与数据处理全部搞定!...

    整理完这些资料已经凌晨3点了,困得眼睛都睁不开,一想到明天就截稿了,他只好随便拼凑一篇应付. 结果可想而知,导师还没看完第一页就把论文给退回来了,说论文通篇缺乏具体数据分析,研究计划就很粗糙,实施起来 ...

  9. python制作小工具_利用Python制作翻译小工具

    话不多说,直接上代码. Component文件: # coding:utf-8 from tkinter import * from tkinter import ttk from tkinter i ...

最新文章

  1. 软件测试实验--性能测试工具LoadRunner
  2. 部分 II. Network
  3. 人类第一次将42写成3个整数的立方和,最后一个100以内的自然数告破
  4. Quick Cocos2dx 调试问题
  5. html屏幕垂直居中显示,HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结...
  6. apk 签名v1与v2的区别
  7. 计算机网络 鲁士文,《在职研究生计算机网络课程统考复习指南》鲁士文 编_孔网...
  8. java swing web_Java-JFrame-swing嵌套浏览器步骤
  9. WebSphere 管理员界面 修改配置之后,没有反应的原因,需要按下[保存]link
  10. 电子电工产品成品及材料灼热丝测试用试验仪
  11. 前端小游戏——植物大战僵尸
  12. 腾讯刷屏!一季度狂赚478亿,员工人均月薪7.6万
  13. 计算离散点线性相关系数
  14. java 读写锁_Java 读写锁的实现
  15. 计算机毕设项目:毕业论文管理系统(二)
  16. Java多线程系列--【JUC线程池 02】- 线程池原理(一)
  17. 前端间隔查询的两种方法:Debounce和Throttle
  18. 使用阿里云服务器搭建代理服务器
  19. C语言中的fprintf函数
  20. psvm怎么补全_vi/vim使用进阶: 自动补全

热门文章

  1. java实现仿QQ即时聊天
  2. patch-wise分类
  3. ios使用keyChain(钥匙串)保存数据
  4. php更新应用到google商店
  5. windows 2012 主机 输入法的切换
  6. Loki的原理及使用
  7. 发布文章管理系统开发中遇到的问题整理 Django + Ckeditor + Apache
  8. NR随机接入之MSG3
  9. docker下载镜像太慢的解决方案
  10. docker 下载镜像失败