python保存图片时如何和原图大小一致

 更新时间:2022年11月29日 10:21:48   作者:吨吨不打野  
这篇文章主要介绍了python保存图片时如何和原图大小一致问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python保存图片时和原图大小一致

之前遇到过一次这个问题,当时解决了但是忘了记录,这里再记录一次好了。

1. matplotlib系列的

整体代码如下:

import cv2
import matplotlib.pyplot as plt  

name="1-1.png"
path="crop/"+name
src = cv2.imread(path)
img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)  
# Opencv和matplotlib读取图片的渠道不同,需要转换
# cv2.imshow("original image", src)
# 获取图像的高度和宽度
plt.savefig('my_fig.png', dpi=my_dpi)
plt.imshow(img)

IMG = cv2.bitwise_not(img)
# 进行反色操作
# cv2.imshow("bitwise image", img)
mydpi=96
plt.figure(figsize=(Width/mydpi,Height/mydpi),dpi=mydpi)
# figsize中的单位是inches,重点解释一下这个figsize参数,先写宽度,再高度
"""
figsize : (float, float), optional, default: None width, height in inches. If not provided, defaults to:rc:`figure.figsize` = ``[6.4, 4.8]``
"""
plt.imshow(IMG)
plt.axis('off')
# 去掉坐标轴

# 保存
plt.savefig("processcrop/"+name,dpi=mydpi)

但是不知道为什么还是会有白边。。。

注意:

  • 如果是在jupyter lab中,plt.axis('off')就不会有问题,但是在jupyter notebook中,就会报错。

jupyter lab中:


在这里插入图片描述

jupyter notebook中,再次恢复环境竟然好了,之前的报错信息大概就是plt.axis("off")这个函数不接受bool类型的值

2. opencv系列的

opencv默认保存就是和原图一样的大小

name="1-1.png"
path="crop/"+name
src = cv2.imread(path)

plt.imshow(src[:, :, ::-1])
plt.axis('off')

img = cv2.bitwise_not(src)
cv2.imwrite("processcrop/"+name,img)

原图:


在这里插入图片描述

保存后的图:


在这里插入图片描述

参考——stack overflow的回答:Specifying and saving a figure with exact size in pixels

plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi)
# 假设有一个800×800pix的图,要显示在本机电脑dpi为96的电脑上,则要保持原图大小显示就可以使用上述代码。
plt.savefig('my_fig.png', dpi=my_dpi)
# 保存成相同分辨率,使用上述代码

# 如果想把分辨率提高10倍,则可以进行如下方式,则就保存了一个8000X8000的高清图
plt.savefig('my_fig.png', dpi=my_dpi * 10)

另外根据另一个回答:How to get matplotlib figure size

import matplotlib.plt
fig = plt.figure()
# 在构建画布的时候就已经有一个默认的分辨率了
size = fig.get_size_inches()*fig.dpi # size in pixels

python批量处理图片统一尺寸

方法一:

import numpy as np
import os
import cv2

# 设置图片路径,该路径下包含了14张jpg格式的照片,名字依次为0.jpg, 1.jpg, 2.jpg,...,14.jpg
DATADIR="D:\Code\ToolBox"
#设置目标像素大小,此处设为300'''
IMG_SIZE=300
#使用os.path模块的join方法生成路径'''
path=os.path.join(DATADIR) 
#使用os.listdir(path)函数,返回path路径下所有文件的名字,以及文件夹的名字,
#例如,执行下行代码后,img_list是一个list,值为['0.jpg','1.jpg','10.jpg','11.jpg','12.jpg','13.jpg','14.jpg',
#'2.jpg','3.jpg','4.jg', '5.jpg', '6.jpg', '7.jpg', 
#'8.jpg', '9.jpg'],注意这个顺序并没有按照从小到大的顺序排列'''
img_list=os.listdir(path)
ind=0
for i in img_list:
    #调用cv2.imread读入图片,读入格式为IMREAD_COLOR'''
    img_array=cv2.imread(os.path.join(path,i),cv2.IMREAD_COLOR)
    #'''调用cv2.resize函数resize图片'''
    new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
    img_name=str(ind)+'.jpg'
    #'''生成图片存储的目标路径'''
    save_path='D:\\Code\\resized\\'+str(ind)+'.jpg'
    ind=ind+1
    #'''调用cv.2的imwrite函数保存图片'''
    cv2.imwrite(save_path,new_array)

方法二:

#提取目录下所有图片,更改尺寸后保存到另一目录
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=128,height=128):
    img=Image.open(jpgfile)
    try:
        new_img=img.resize((width,height),Image.BILINEAR)   
        new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
    except Exception as e:
        print(e)
for jpgfile in glob.glob("E:\\img\\*.jpg"):
    convertjpg(jpgfile,"E:\\lianhua")

方法三:该方法批量修改图片大小和文件夹名称

import os
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r'c:\windows\fonts\SimSun.ttc', size=14)

# 获取当前路径
path_abs = os.getcwd()
print u'*****************开始文件名更名操作*****************'
print path_abs
# 遍历当前路径下的文件以及文件目录
for root, dir_name, file_name in os.walk(path_abs):
    # 统计文件夹个数
    num_dir = len(dir_name)
    for idx, item in enumerate(dir_name):
        print u'第', idx, u'个文件正在更名......'
        item_new = 'test_' + '0' * (1 - idx / 10) + str(idx)
        # 原文件路径
        path_dir_old = path_abs + '\\' + item
        # print u'原文件路径:', path_dir_old
        # 新文件路径
        path_dir_new = path_abs + '\\' + item_new
        # print u'新文件路径:', path_dir_new
        # 更名操作
        os.renames(path_dir_old, path_dir_new)
print u'*****************文件名更名完毕!*****************'

print u'*****************图片名更名*******************'
for root1, dir_name1, file_name1 in os.walk(path_abs):
    num1_dir = len(dir_name1)
    for idx1, item1 in enumerate(dir_name1):
        path_dir1 = path_abs + '\\' + item1
        for root2, dir_name2, file_name2 in os.walk(path_dir1):
            for idx2, item2 in enumerate(file_name2):
                # 原路径 + 图片名
                item2_old = path_dir1 + '\\' + item2
                # 新路径 + 图片名(强制转换成jpg格式,数字6制定图片名长度以及0的填充个数)
                item_new2 = 'idx_'+ '0' * (5 - len(str(idx2))) + str(idx2)
                item2_new = path_dir1 + '\\' + item_new2 + '.jpg'
                # 更名
                os.rename(item2_old, item2_new)
                # resize 成指定尺寸大小
                img = Image.open(item2_new)
                img_new = img.resize((220, 220))
                # save 保存
                img_new.save(item2_new)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python运维自动化psutil模块的监控和管理深入探究

    Python运维自动化psutil模块的监控和管理深入探究

    这篇文章主要为大家介绍了Python运维自动化psutil模块的监控和管理深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python之变量类型和if判断方式

    Python之变量类型和if判断方式

    这篇文章主要介绍了Python之变量类型和if判断方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python如何利用plt.legend()添加图例代码示例

    python如何利用plt.legend()添加图例代码示例

    用python的matplotlib画图时,往往需要加图例说明,下面这篇文章主要给大家介绍了关于python如何利用plt.legend()添加图例的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Python NumPy 数组索引的示例详解

    Python NumPy 数组索引的示例详解

    数组索引是指使用方括号([])来索引数组值,numpy提供了比常规的python序列更多的索引工具,除了按整数和切片索引之外,数组可以由整数数组索引、布尔索引及花式索引,这篇文章主要介绍了Python NumPy 数组索引,需要的朋友可以参考下
    2023-01-01
  • python 扩展print打印文件路径和当前时间信息的实例代码

    python 扩展print打印文件路径和当前时间信息的实例代码

    本文通过实例代码给大家介绍了python 扩展print打印文件路径和当前时间信息,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 一文带你搞懂Python中isinstance和type的区别

    一文带你搞懂Python中isinstance和type的区别

    在Python中,我们经常需要检查一个对象的类型,Python提供了两种方法来获取对象的类型:isinstance和type,这两种方法有什么区别呢,本文将详细介绍这两种方法的区别和使用,需要的朋友可以参考下
    2023-06-06
  • Pycharm插件(Grep Console)自定义规则输出颜色日志的方法

    Pycharm插件(Grep Console)自定义规则输出颜色日志的方法

    这篇文章主要介绍了Pycharm插件(Grep Console)自定义规则输出颜色日志的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Python实现的IP端口扫描工具类示例

    Python实现的IP端口扫描工具类示例

    这篇文章主要介绍了Python实现的IP端口扫描工具类,结合实例形式分析了Python基于socket模块与多线程操作实现IP端口扫描的相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • python爬取微信公众号文章

    python爬取微信公众号文章

    这篇文章主要为大家详细介绍了python爬虫实战案例,微信公众号文章的爬取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 使用Python制作一个备忘录工具

    使用Python制作一个备忘录工具

    这篇文章主要为大家详细介绍了如何使用Python开发一个简单而功能强大的备忘录应用,以及提供详细的示例代码,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12

最新评论