Перезагрузить и увеличить изображение - PullRequest
0 голосов
/ 13 октября 2018

Я немного играю с изображением размером 100x100 пикселей, постоянно создавая и обновляя его.Мой код работает нормально, но я хочу, чтобы изображение отображалось и обновлялось по мере запуска программы, настолько увеличенное, что я могу видеть отдельные пиксели.

В настоящее время я просто открываю полученное изображение в Eye of Gnome., который перезагружается автоматически.Проблема здесь в том, что при каждой перезагрузке уровень масштабирования возвращается к 100% (и он должен быть на уровне 600% или около того).

while self.running:
    img.save("image.tmp.png")
    time.sleep(1)
    os.rename("image.tmp.png", "image.png")

Попытка использовать метод PIL show работает, но создаетновое окно для каждого вида.

while self.running:
     img.show()

Как я могу постоянно перезагружать изображение, сохраняя при этом уровень масштабирования?

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете попробовать запустить tkinter (установить пакет python3-tk в Linux, не знаю о других ОС) как отдельный процесс:

from PIL import ImageTk, Image

from scipy.ndimage import rotate
from scipy.misc import imresize
import numpy as np
import time


# do not import *, as there is another Image
from tkinter import NW, Tk, Canvas, Label

from multiprocessing import Process, Queue


# initial image
image = Image.open("img.png")


# convert to numpy
image = np.array(image)


# process which will show updated images
def display_process(q):
    # initialize window and label which will show images
    master = Tk()
    label = Label(master)
    label.pack()


    # take numpy image from Queue, draw in on canvas
    def change_img(): 
        # get one image from queue. 
        # if there is no one, None will be received
        image = q.get()
        # if not image received yet, skip
        if image is not None:
            print(image.shape)
            # image array should be uint8 type with 3 channels (x, x, 3)
            photo = ImageTk.PhotoImage(image = Image.fromarray(image))
            label.configure(image=photo)
            label.image = photo


        # needed to schedule next update: 
        master.update_idletasks()
        # check for new image after 50ms
        master.after(50, change_img)


    change_img()
    master.mainloop() # locks process

# Queue, through which exchange will be made
q = Queue()
q.put(image)

p = Process(target=display_process, args=(q,))
p.daemon = True # exit process on program exit

p.start() # start process




# main program (your loop code here) ----------

# Example:


for i in range(10):
    # take numpy image, rotate it
    image = rotate(image, 90)

    # you can use fixed zoom factor for your images
    # interp='nearest' uses nearest neghbor interpolation without smoothing
    # (so you can see pixels)
    image2 = imresize(image, 5.0, interp='nearest')
    # send it to process
    q.put(image2)
    time.sleep(0.5)
...