我有一些代码可以读取一个小的BMP(128x96)文件,并将RGB值放入列表中。
然后我运行一个嵌套循环,并从列表中反向读取RGB值并将其绘制在屏幕上。
它开始非常快,在一秒钟内绘制了前20条线,但是逐渐变慢到我从未见过的程度。它只有一个128x96的小图像。
我觉得这是对graphics.py库的调用,请问为什么,还是其他?
如果可以的话,我正在树莓派上运行它。 Python 3.4.2
如果您有兴趣尝试,可以在这里https://drive.google.com/open?id=1yM9Vn1Nugnu79l1UNShamEAGd2VWF3T4
找到支持文件。(这是我正在使用的graphics.py库,还有一个很小的bmp文件,实际上是有问题的名为SlowDownWhy.py的文件)
import math
import sys
from graphics import *
from PIL import Image
# Initialise Vars for Image width n height
iw=0
ih=0
img=Image.open("ani1.bmp","r") # Open Image
iw, ih = img.size # Set image width n height
ch = int(1000/ih) # Cube height set
cw = ch # Cube width set
win = GraphWin("My Window", iw*cw, ih*ch)
win.setBackground(color_rgb(128,128,128))
#Transfer Bitmap RGB vales to csv list - 'RGBlist'
pix_val = list(img.getdata())
RGBlist = [x for sets in pix_val for x in sets]
noe = (iw * ih * 3)-3
x = iw
y = ih
for vy in list(range(ih)):
y = y-1
x = iw
for vx in list(range(iw)):
x = x-1
r=RGBlist[noe]
g=RGBlist[noe+1]
b=RGBlist[noe+2]
noe=noe-3
cx=x*cw
cy=y*ch
aPoint = Rectangle(Point(cx,cy), Point(cx+cw,cy+ch))
aPoint.setFill(color_rgb(r,g,b))
aPoint.draw(win)
它应该创建一个高度不超过1000像素的窗口,并开始从右下到左上一行一行地绘制图片。但会逐渐变慢。
答案 0 :(得分:0)
忽略无效的语法,这仅仅是因为graphics.py
的编程方式:它并非旨在处理放置在屏幕上的这么多对象。 (它在后端使用tkinter,它将减慢128 * 96 = 12,288个对象的速度)。对于渲染图像,您应该直接将其集成或使用另一个库,例如pygame。
要将其集成到graphics.py
程序中,有一个Image
类,您在PIL.Image
库中进行了改写(这就是为什么您从不{{1 }})。看这里:Importing custom images into graphics.py