Как добавить несколько эффектов к изображению, таких как контрастность и яркость одновременно - PullRequest
0 голосов
/ 21 декабря 2018

Я создал простую программу, использующую python для изменения контраста изображения, цвета яркости и т. Д. Сначала я просто добавил один эффект, и он работал хорошо, мне удалось связать его со Scaler.Затем я попытался добавить несколько эффектов одновременно, которые я также связал со скейлерами, но когда я пытаюсь добавить несколько эффектов на изображение (например, контрастность и яркость одновременно), я получил серый экран, или просто ничего не произошлоизображение.

from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from PIL import Image
from PIL import ImageEnhance


def main():
    window = Tk()
    window.geometry("400x290")
    window.configure(background="#EBEBEB")
    OpenB = ttk.Button(window, text="Import Photo")
    OpenB.pack()

    def onClickImport():
        askimage = askopenfilename()
        global img
        img=Image.open(askimage)

    OpenB.config(command=onClickImport)
    window.mainloop()
    window2 = Tk()
    window2.geometry("400x290")
    window2.configure(background="#EBEBEB")

    DisplayButton=ttk.Button(window2,text="Show")
    DisplayButton.pack()
    ScalerContrast= ttk.Scale(window2, from_=1.0, to_=5.0)
    ScalerContrast.pack()
    ScalerBrightness = ttk.Scale(window2, from_=1.0, to_=5.0)
    ScalerBrightness.pack()
    ScalerColor = ttk.Scale(window2, from_=1, to_=100)
    ScalerColor.pack()
    ScalerSharpness = ttk.Scale(window2, from_=1, to_=100)
    ScalerSharpness.pack()

    textCon=Text(window2,width=8,height=1)
    textCon.insert(END,"Contrast")
    textCon.config(state=DISABLED)
    textCon.configure(background="#EBEBEB")
    textCon.configure(font="Roboto")
    textCon.pack()

    textBr=Text(window2,width=8,height=1)
    textBr.insert(END,"Brightness")
    textBr.config(state=DISABLED)
    textBr.configure(background="#EBEBEB")
    textBr.configure(font="Roboto")
    textBr.pack()

    textCor=Text(window2,width=8,height=1)
    textCor.insert(END,"Color")
    textCor.config(state=DISABLED)
    textCor.configure(background="#EBEBEB")
    textCor.configure(font="Roboto")
    textCor.pack()

    textSh=Text(window2,width=8,height=1)
    textSh.insert(END,"Sharpness")
    textSh.config(state=DISABLED)
    textSh.configure(background="#EBEBEB")
    textSh.configure(font="Roboto")
    textSh.pack()

    converter = ImageEnhance.Contrast(img)
    converter1= ImageEnhance.Brightness(img)
    converter2= ImageEnhance.Color(img)
    converter3= ImageEnhance.Sharpness(img)

    def onClickDisplay():
        img2=converter.enhance(ScalerContrast.get()) and converter1.enhance(ScalerBrightness.get()) and\
        converter2.enhance(ScalerColor.get())   and converter3.enhance(ScalerColor.get())
        img2.show()

    DisplayButton.config(command=onClickDisplay)

    window2.mainloop()


if __name__=='__main__':
    main()

1 Ответ

0 голосов
/ 21 декабря 2018

Добро пожаловать на ТАК!Прежде всего, вам не нужно использовать config для всех ваших кнопок, текстовых виджетов и т. Д. - вы можете просто указать все эти параметры в качестве аргументов при создании виджета, например,

textCon = Text(window2, width=8, height=1, state=DISABLED, background="#EBEBEB", font="Roboto")

Это делает ваш код короче, проще и быстрее.То, что вы делаете в onClickDisplay, не работает по простой причине.Вы используете and, который является логическим оператором, чтобы попытаться сделать несколько вещей одновременно - это не то, о чем and.Вот как я бы переписал ваш код:

class CustomImageEnhancer()
    def __init__(self):

        def onClickImport():
            askimg = fd.askopenfilename()
            self.img = Image.open(askimage)
            return self.img

        def converted_image(img_a, contrast, brightness, color, sharpness):
            contrast_converter = ImageEnhance.Contrast(img_a)
            img_b = contrast_converter.enhance(contrast)
            brightness_converter = ImageEnhance.Brightness(img_b)
            img_c = brightness_converter.enhance(brightness)
            color_converter = ImageEnhance.Color(img_c)
            img_d = color_converter.enhance(color)
            sharpness_converter = ImageEnhance.Sharpness(img_d)
            img_final = sharpness_converter.enhance(sharpness)
            return img_final

        def onClickDisplay():
            cont = ScalerContrast.get()
            bright = ScalerBrightness.get()
            col = ScalerColor.get()
            sharp = ScalerSharpness.get()
            img = self.img
            new_img = converted_image(img, cont, bright, col, sharp)
            new_img.show()

        root = Tk()
        OpenB = ttk.Button(root, text="Import Photo", command=onClickImport)
        OpenB.pack()

        DisplayButton=ttk.Button(root, text="Show", command=onClickDisplay)
        ScalerContrast= ttk.Scale(root, from_=1.0, to_=5.0)
        ScalerBrightness = ttk.Scale(root, from_=1.0, to_=5.0)
        ScalerColor = ttk.Scale(root, from_=1, to_=100)
        ScalerSharpness = ttk.Scale(root, from_=1, to_=100)

        DisplayButton.pack()
        ScalerContrast.pack()
        ScalerBrightness.pack()
        ScalerColor.pack()
        ScalerSharpness.pack()

        textCon=Text(root, width=8, height=1, state=DISABLED, background="#EBEBEB", font='Roboto')
        textCon.insert(END, 'Contrast')
        textCon.pack()

        textBr=Text(root, width=8, height=1, state=DISABLED, background='#EBEBEB', font='Roboto')
        textBr.insert(END, 'Brightness')
        textBr.pack()

        textCor=Text(root, width=8, height=1, state=DISABLED, background='#EBEBEB', font='Roboto')
        textCor.insert(END, 'Color')
        textCor.pack()

        textSh=Text(root, width=8, height=1, state=DISABLED, background='#EBEBEB', font='Roboto')
        textSh.insert(END, 'Color')
        textSh.pack()

        root.mainloop()


window=CustomImageEnhancer()

Определив класс, вы можете обойти необходимость использования глобальных переменных.Открытие двух окон не является обязательным в вашем случае, так как вы можете просто добавить кнопку для выбора файла изображения в другое окно.Я бы рекомендовал использовать place() вместо pack(), так как это позволит вам точно определить координаты x и y для ваших разных виджетов внутри окна, что сделает его более структурированным - pack просто размещает виджеты один за другим.

...