Загрузка большого изображения в Tkinter вызывает MemoryError - PullRequest
0 голосов
/ 18 декабря 2018

Моя история - я микробиолог, самоучка в программировании.Если есть более простые способы сделать это или очистить мой код, я всегда открыт для конструктивной критики и способов улучшения.Я пытаюсь создать графический интерфейс, используя tkinter в python, используя следующий код:

import sys
import cv2

from tkinter import *
from PIL import ImageTk, Image
import cv2

class TypeOneDetectionEditor(object):
    def __init__(self):

        image_file = "6wk_Control_B_01.png"  # Update the file as needed

        self.image_cv = cv2.imread(image_file)
        self.resize_factor = 0.1
        self.height, self.width, self.channel = self.image_cv.shape

        self.window = Tk()
        self.frame = Frame(self.window, bd=5, relief = SUNKEN)

        # Hard-code choice of resolution for canvas and scroll region as
        # maximum shape of images*resize_factor
        self.canvas = Canvas(self.frame, bg="#000000", width=1366, height=768,
                             scrollregion=(0, 0, self.width*self.resize_factor,
                                           self.height*self.resize_factor))

        # Scrollbars
        hbar=Scrollbar(self.frame,orient=HORIZONTAL)
        hbar.pack(side=BOTTOM,fill=X)
        hbar.config(command=self.canvas.xview)
        vbar=Scrollbar(self.frame,orient=VERTICAL)
        vbar.pack(side=RIGHT,fill=Y)
        vbar.config(command=self.canvas.yview)
        self.canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)

        # Img + Event listeners
        # Literally because tkinter can't handle references properly and needs this.
        self.canvas.image = ImageTk.PhotoImage(Image.fromarray(self.image_cv))
        # So we can change the image later
        self.canvas_image_config = self.canvas.create_image(0, 0,
                                                            image=self.canvas.image,
                                                            anchor="nw")
        # Sets the focus to our program besides putting it in the background
        self.canvas.focus_set()
        # Put future functions here
        self.canvas.pack(side=LEFT)
        self.window.mainloop()

TypeOneDetectionEditor()

Ошибка, которую я получаю, сообщает:

Traceback (most recent call last):
  File "Bacterial Counter GUI.py", line 45, in <module>
    TypeOneDetectionEditor()
  File "Bacterial Counter GUI.py", line 35, in __init__
    self.canvas.image = ImageTk.PhotoImage(Image.fromarray(self.image_cv))#Literally because tkinter can't handle references properly and needs this.
  File "C:\Users\basay3\AppData\Local\Continuum\anaconda3\lib\site-packages\PIL\ImageTk.py", line 120, in __init__
    self.paste(image)
  File "C:\Users\basay3\AppData\Local\Continuum\anaconda3\lib\site-packages\PIL\ImageTk.py", line 175, in paste
    block = image.new_block(self.__mode, im.size)
MemoryError

Я обновил библиотеки tkinter и pillow.но это все еще не решило проблему.Образ, который я пытаюсь использовать, имеет размер 604 МБ (слишком большой для загрузки в этот пост), и у меня на компьютере 16 ГБ ОЗУ.Я в растерянности, так что любой совет на этом этапе будет полезен.

...