开发者

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

目录
  • python保存图片时和原图大小一致
    • 1. matplotlib系列的
    • 2. opencv系列的
  • 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中:

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

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

    2. opencv系列的

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

    name="1-1.png"
    path="crop/"+name
    src = cv2.imread(path)
    
    plt开发者_JAVA教程.imshow(src[:, :, ::-1])
    plt.axis('off')
    
    img = cv2.bitwise_not(src)
    cv2.imwrite("processcrop/"+name,img)
    

    原图:

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

    保存后的图:

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

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

    plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi)
    # 假设有一个800800pix的图,要显示在本机电脑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)函http://www.devze.com数,返回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'*****************图片名更名***********php********'
    fhttp://www.devze.comor 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
      www.devze.com 编程客栈     # 新路径 + 图片名(强制转换成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)

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

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜