2016-07-25 102 views
3

我使用Bokeh軟件包生成地圖以顯示模擬結果。輸出是具有交互性的html格式的單獨地圖。交互性是個別地圖所必需的。Python打開html文件,截取屏幕截圖,裁剪並保存爲圖像

請參閱此鏈接的示例:

http://bokeh.pydata.org/en/0.10.0/docs/gallery/texas.html

仿真可以被自動設置爲運行的次數和將產生的地圖爲每次運行。這可能是100張地圖。我希望能夠將地圖縫合在一起以創建電影 - 交互性不是必需的。 Bokeh具有通過瀏覽器創建PNG文件的功能,因此可以手動將每個地圖保存爲文件並使用ffmpeg創建電影。但是,如果您需要爲100個文件執行此操作,則這不是一個真正的選項。目前無法通過Bokeh自動生成PNG文件,但我相信它會在某些時候添加。

所以我需要一個解決方法。我的想法是從他們存儲在本地驅動器上的位置打開每個html文件,拍攝屏幕截圖,裁剪圖像以保留所需的部分並保存。但我還沒有找到可行的解決方案。

裁剪圖像很簡單:

from PIL import Image 

img = Image.open(file_name) 
box = (1, 1, 1000, 1000) 
area = img.crop(box) 
area.save('saved_image', 'jpeg') 

我的問題是打開HTML文件,並採取截屏擺在首位喂到上面的代碼。

爲此,我嘗試了以下操作,但都需要一個URL而不是html文件。也都使用Firefox不起作用,但我已經安裝了Chrome並適當地更改了代碼。

How to take partial screenshot with Selenium WebDriver in python?

http://www.idiotinside.com/2015/10/20/take-screenshot-selenium-python/

我的代碼是:

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('file_name') 
driver.save_screenshot('image.png') 
driver.quit() 

將返回:

{"code":-32603,"message":"Cannot navigate to invalid URL"} 

顯然文件名不是一個URL,這樣是明確的。如果你通過它的網站,它工作正常。任何幫助獲得一個HTML加載和拍照將不勝感激!它不必涉及硒。

+0

是什麼操作系統,你運行? – zhqiat

+0

Ubuntu 14.04和Windows。 – Pete

+0

我希望一個散景的人有一個方法給你;但我會建議使用Qt的qwebview渲染你的HTML,並抓住窗口形象http://stackoverflow.com/questions/24413385/pyqt4-qwidget-save-as-image – mdurant

回答

4

由於散景0.12.6的,現在無需打開瀏覽器更容易直接從Python中採取這些截圖。

導出的PNG文件看起來像這樣

export_png(plot, filename="plot.png") 

和出口SVGs看起來像這樣

plot.output_backend = "svg" 
export_svgs(plot, filename="plot.svg") 

有跡象表明,需要安裝一些可選的依賴。 你可以在Exporting Plots section of the User Guide找到更多的信息。

+0

海事組織這應該是新的接受的答案 – bigreddot

+0

同意和改變 – Pete

0

如果您正在運行Linux,則可能需要執行以下步驟。

首先在默認應用程序中通過command line打開html文件。你可能需要做點像

import os 

os.system('command to open html file') 

使用solution listed來截取你的截圖。

然後按照建議在PIL中進行處理。

如果你在Windows這樣做,

您可能要設置的AutoIt的驅動程序,以便您可以使用Python腳本來處理GUI窗口等。

2

您可以使用SimpleHTTPServer創建一個基本的Web服務器暴露你的本地文件。

你應該在HTMT是python -m SimpleHTTPServer 8000

然後,只需改變driver.get('file_name')driver.get('localhost:8000/file_name.html')

我建議你使用路徑運行此「等到」,以確保一切都加載之前拿截圖:

driver.wait.until(EC.visibility_of_element_located((By.XPATH,'//*[@id="someID"]')))

2

hgazibara意見被證明是最簡單的˚F九。一些簡化的代碼在下面提供答案。如果網頁實際上並不需要顯示自己的屏幕截圖,那將會很好。我會看看我是否可以稍後添加。

import glob 
from PIL import Image 
from selenium import webdriver 

# get a list of all the files to open 
glob_folder = os.path.join(file_location, '*.html') 

html_file_list = glob.glob(glob_folder) 
index = 1 

for html_file in html_file_list: 

    # get the name into the right format 
    temp_name = "file://" + html_file 

    # open in webpage 
    driver = webdriver.Chrome() 
    driver.get(temp_name) 
    save_name = '00' + str(index) + '.png'  
    driver.save_screenshot(save_path, save_name)) 
    driver.quit() 
    index += 1 

    # crop as required 
    img = Image.open(save_path, save_name)) 
    box = (1, 1, 1000, 1000) 
    area = img.crop(box) 
    area.save('cropped_image' + str(index), 'png')