Windows上的Python图像库show()

7 投票
1 回答
8851 浏览
提问于 2025-04-17 10:39

我正在写一个脚本,这个脚本可以从网上下载各种图片文件,然后用PIL库对它们进行一些处理。这个脚本使用urlretrieve把图片保存到临时文件里,现在我只是想用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()时,查看器里什么也没有:

enter image description here

我还尝试过打开本地的非临时文件,看看这是否是问题的一部分,但结果也是一样。我的操作系统是Windows Vista 32位SP2。有没有人知道可能出什么问题了?

1 个回答

8

show()这个命令试图用一个默认的图片查看器来打开一个临时的图片文件,并使用start /wait这个指令。/wait的意思是要等到查看器关闭后,才能删除这个文件。可惜的是,在Vista和Windows 7系统下,默认的查看器对/wait的响应不太好,甚至在文件打开之前就返回了,这样文件就会在显示之前被删除。

通常的解决办法是修改PIL包里的ImageShow.py文件,添加一个额外的命令,让程序在删除文件之前等几秒钟。虽然这不是最好的办法,但大多数情况下是有效的。详细信息可以查看velocityreviews.com这里的StackOverflow

另一种解决方法是把.bmp文件格式关联到一个能正确等待的程序,比如mspaint.exe。

撰写回答