【问题标题】:resizing a folder of images调整图像文件夹的大小
【发布时间】:2021-06-14 02:09:20
【问题描述】:

我想在文本框中写入高度和宽度后调整图像文件夹的大小,我需要使用 tkinter 保存这个调整大小的文件夹。我从这段代码开始:

import tkinter as tk 
from PIL import ImageTk, Image
from tkinter import filedialog
import os

root = Tk()
root.geometry("800x600")
src_file = StringVar()
imgWidth = IntVar()
imgHeight = IntVar()

def open_filedialog():
      global  folder
      folder = filedialog.askdirectory()
      src_file.set(folder) 

label = Label(wrapper, text="Source File")
label.pack(side=LEFT, padx=10, pady=10)

entry = Entry(wrapper, textvariable = src_file,width="50")
entry.pack(side = LEFT, padx=10, pady=10)

select_btn = Button(wrapper , text="Select Image",command= open_filedialog)
select_btn.pack(side= LEFT, padx=10,pady=10)

width_box = Entry(imageResize_wrapper,textvariable = imgWidth)
width_box.pack(side=LEFT, padx=10, pady=10)

height_box = Entry(imageResize_wrapper,textvariable = imgHeight)
height_box.pack(side=LEFT, padx=10, pady=10)

set_btn = Button(imageResize_wrapper, text = "Set",font=(
 "Consaolas", 16),fg="#000", command = set_imageSize)
set_btn.pack(side= LEFT, padx=10, pady=10)

root.mainloop()

【问题讨论】:

  • 所以你想调整文件夹中的图片大小并保存
  • 您可以使用 OpenCV 调整大小。例如,resized_img = cv2.resize(img, (imgWidth.get(),imgHeight.get()), interpolation = cv2.INTER_CUBIC)。而且您还需要获取所选文件夹的路径。然后,您可以调整文件夹中文件的大小或任何您想要的文件。检查这个答案stackoverflow.com/a/21518989/13560126
  • 请说明您想要什么并提供您尝试过的内容,因为给定的代码几乎什么也没做,或者您没有提供足够的内容,例如我看不到set_imageSize(顺便说一句每个 PEP8 应该像 set_image_size) 函数

标签: python tkinter


【解决方案1】:

这里有一个解决方案:

from tkinter import Tk, Label, Entry, Button, Frame
from tkinter.filedialog import askdirectory
from PIL import Image
import os


def get_dir():
    directory = askdirectory()
    dir_lbl.config(text=directory)


def convert_images():
    source = dir_lbl.cget('text')
    extension = '.png'
    w = int(width.get())
    h = int(height.get())
    image_list = [source + '/' + file for file in os.listdir(path=source) if extension in file]
    new_dir = source + '_converted'
    os.mkdir(new_dir)

    for image in image_list:
        print(image)
        img = Image.open(image)
        img = img.resize((w, h), Image.ANTIALIAS)
        img.save(new_dir + f'/{image.split("/")[-1]}')


root = Tk()
root.geometry('500x300')

dir_frame = Frame(root)
dir_frame.pack(pady=10)

Button(dir_frame, text='Choose Directory', command=get_dir).pack()
dir_lbl = Label(dir_frame, text='')
dir_lbl.pack()

settings_frame = Frame(root)
settings_frame.pack(pady=10)

width_frame = Frame(settings_frame)
width_frame.pack()
Label(width_frame, text='Width: ').pack(side='left')
width = Entry(width_frame)
width.pack(side='right')

height_frame = Frame(settings_frame)
height_frame.pack()
Label(height_frame, text='Height: ').pack(side='left')
height = Entry(height_frame)
height.pack(side='right')

Button(settings_frame, text='Convert All', command=convert_images).pack(pady=10)

root.mainloop()

首先要提到的是,可以添加许多其他选项供用户选择以及如何处理图片,例如允许逐步浏览每张图片,或者可能允许选择自己的目录名称,但简单的东西就在这里。

说明 首先导入所有必要的东西:库、模块、类和东西

然后定义一个函数来获取用户将选择的目录。这是一个简单的过程:使用内置方法调用“选择器”并将返回的字符串(即目录路径)放在标签上,以显示用户选择的内容并存储参考。

定义了最重要的另一个函数。首先使用tkinter 中小部件的.cget 方法从标签中获取文本(也可以使用dir_lbl['text'] 之类的东西或其他东西)。那将是源目录。然后为可读性定义一个扩展,如果将来添加一个参数,则更容易更改内容。接下来获取用户输入的调整大小图像的宽度和高度(应添加一些内容以防止用户输入错误数据),然后使用列表推导创建该目录中所有图像的列表。 (如果您不了解它们,您应该阅读它们,因为出于这些原因,它们非常棒)但基本上它的作用是添加文件名中包含 .png 的所有文件(因此理论上可能类似于 image.png.jpg也添加了,但如果真的发生的话,这是非常罕见的,再次可以改进)。然后创建一个新的目录名称(和路径),基本上只需在当前目录名称的末尾添加"_converted"(再次可以将其更改为用户选择或某事)。然后使用os 模块创建一个新目录(可能仅适用于Windows,因此可以使用更跨平台的东西)。然后遍历所有这些图像,打开它们并调整它们的大小,然后保存在新目录中。

其余的代码几乎是纯粹的tkinter,没有太多要解释的。

如果您有任何问题,请询问他们。

【讨论】:

  • 我需要调整许多图像文件类型的大小。如何在此代码中包含更多扩展名(.jpg、.svg、.gif 等)。
  • 实际上我做错了,因为有一种简单的方法可以实际检查实际扩展名(最后一点)。好的,那么您想要做的是扩展extension 字符串,例如,出于可读性目的,只需像extension = '.png, .jpg, .jpeg' 这样简单地做某事,但是可以只做extension = 'pngjpgjpeg',但这不那么可读(这些更改也必须进行下一次更改):将列表理解更改为:image_list = [source + '/' + file for file in os.listdir(path=source) if file.split('.')[-1] in extension]
  • 这将检查文件的实际扩展名,以便解决问题(在我的回答中讨论过),并且它会根据该字符串检查它,所以基本上如果 .在该字符串中,它们将匹配,因此将添加文件路径。然后也可以将变量重命名为extensions
【解决方案2】:

我试过这个代码。它对我有用。

from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog
import os, sys, glob


root = Tk()
root.geometry("800x600")

src_file = StringVar()
imgWidth = IntVar()
imgHeight = IntVar()


def open_filedialog():
    folder = filedialog.askdirectory( parent = root)
    src_file.set(folder)
    

#resize image
def set_image_size():
    root_dir = src_file  
    nw = int(imgWidth.get())
    nh = int(imgHeight.get()) 
    for file in glob.iglob(root_dir.get() +'**/*.jpg', recursive=True) : 
        print(file)
        im = Image.open(file)
        imResize = im.resize((nw,nh), Image.ANTIALIAS)
        imResize.save(file)    
        imResize.save(file)

    
           

wrapper = LabelFrame(root,text="Source File")
wrapper.pack(fill="both",expand="yes",padx=20,pady=20)

imageResize_wrapper = LabelFrame(root,text="Resize")
imageResize_wrapper.pack(fill="both",expand="yes",padx=20,pady=20)

Image_wrapper = LabelFrame(root, text="Image")
Image_wrapper.pack(fill="both",expand="yes",padx="20",pady=20)

#wrapper 
label = Label(wrapper, text="Source File")
label.pack(side=LEFT, padx=10, pady=10)

entry = Entry(wrapper, textvariable = src_file,width="50")
entry.pack(side = LEFT, padx=10, pady=10)

select_btn = Button(wrapper , text="Select Image",command= open_filedialog)
select_btn.pack(side= LEFT, padx=10,pady=10)
# wrapper 

#image Resize wrapper 
width_lbl = Label(imageResize_wrapper, text="width", font=(
    "Consaolas", 16),fg="#000", bg="#DF9B6D")
width_lbl.pack(side=LEFT,padx=10, pady=10)

width_box = Entry(imageResize_wrapper,textvariable = imgWidth)
width_box.pack(side=LEFT, padx=10, pady=10)

height_lbl = Label(imageResize_wrapper, text="Height", font=(
    "Consaolas", 16),fg="#000", bg="#DF9B6D")
height_lbl.pack(side=LEFT,padx=10, pady=10)

height_box = Entry(imageResize_wrapper,textvariable = imgHeight)
height_box.pack(side=LEFT, padx=10, pady=10)

set_btn = Button(imageResize_wrapper, text = "resize and save",font=(
    "Consaolas", 16),fg="#000", command = set_image_size)
set_btn.pack(side= LEFT, padx=10, pady=10)



root.mainloop()

但我需要在 glob.iglob() 中包含更多扩展名(.jpg、.jpeg 等)。如何编辑上述代码来实现它。

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2014-02-26
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多