我正在编写一个脚本,从Web下载各种图像文件,然后使用PIL对它们进行一些处理。该脚本使用urlretreive将图像转储到临时文件,现在我只是尝试使用PIL image.show()方法在查看器中打开它们。以下是代码的相关部分:
def main():
link_queue = Queue.Queue()
image_queue = Queue.Queue()
links = get_image_links('test_search')
for link in links:
link_queue.put(link)
for image in xrange(len(links)):
#create image downloading threads
t = ImageDownloadingThread(link_queue, image_queue)
t.setDaemon(True)
t.start()
link_queue.join()
image_data = image_queue.get()
image_file, image_url = image_data[0][0], image_data[1][0]
#get the first image downloaded and take a look
image = Image.open(image_file)
image.show()
不幸的是,虽然临时文件似乎加载正常(Image.open没有返回任何错误),但是当调用image.show()时,我在查看器中什么也得不到:
我还尝试打开本地非临时文件,以防这是问题的一部分并获得相同的结果。操作系统是Windows Vista 32位SP2。关于可能出现什么问题的任何想法?
答案 0 :(得分:7)
show()
尝试在临时图像文件上使用start /wait
命令执行默认图像查看器。 /wait
参数应该等到查看器退出,以便可以删除该文件。遗憾的是,Vista和Windows 7下的默认查看器无法正确响应/wait
并在打开文件之前返回;文件在显示之前就会被删除。
通常的解决方法是在PIL包中编辑ImageShow.py并添加一个额外的命令,等待几秒钟才能删除文件。这是一个kludge,但它大部分时间都有效。详情请见velocityreviews.com和here at StackOverflow。
另一种解决方法是将.bmp
文件格式与在返回之前正确等待的程序相关联,例如mspaint.exe。