我制作了一个程序来仅过滤20种颜色的图像,并且我想保存程序在完成之前所进行的过程,我已经成功保存了图像,但是这花费了很多时间。
可以说用户给我一张800x600的图像,我的程序需要大约15秒或更短的时间才能完成图像的编辑,但是如果我每步保存一次,大约需要10分钟。因为在每次保存之后,该程序都在等待文件准备就绪,不需要它可以继续移动的图像,而由winodws处理它。
我尝试使用线程进行处理,并且得到相同的结果,每个图像大约1秒。
from PIL import Image
from PIL import ImageGrab
im = Image.open('braw.png') # Can be many different formats.
rgb_im = im.convert('RGB')
pix = rgb_im.load()
height, width = im.size
image = ImageGrab.grab()
path = os.getcwd()
def read_color(height,width, COLORS):
for x in range(height):
for y in range(width):
r,g,b = rgb_im.getpixel((x,y))
color = closest_color(r, g, b, COLORS)
back_work(color,x,y)
save_frame(x, '/frames')
def save_frame(x, location):
try:
rgb_im.save(path + location+'/ark_ai' + str(x) + '.jpeg')
except OSError:
sleep(0.5)
def back_work(color, x, y):
pix[x,y] = color
我期望程序在每次循环后都会保存图像,即使没有执行完,是否有一种更快的方式来使我不知道?
答案 0 :(得分:2)
似乎每次更新像素时您都在保存,这意味着您要保存480,000张图像,总共691 GB写入磁盘。当然,由于您要覆盖99%的文件,因此并非所有内容都会立即保存到硬盘中。尽管如此,这还是有很多文件I / O,而您根本无法做很多事情来加快速度。
为什么您不尝试在每个列更新之后而不是每个像素进行保存?这将使您节省的工作量减少了600倍。输出应该是相同的,因为您只是跳过保存无论如何都会被覆盖的帧。
def read_color(height,width, COLORS):
for x in range(height):
for y in range(width):
r,g,b = rgb_im.getpixel((x,y))
color = closest_color(r, g, b, COLORS)
back_work(color,x,y)
save_frame(x, '/frames')