2016-07-25 15 views
3

Ich verwende das Bokeh-Paket, um Karten zu generieren, um die Ergebnisse einer Simulation anzuzeigen. Die Ausgabe besteht aus einzelnen Karten im HTML-Format mit Interaktivität. Die Interaktivität wird für einzelne Karten benötigt.Python HTML-Datei öffnen, Screenshot erstellen, zuschneiden und als Bild speichern

Siehe diesen Link für ein Beispiel:

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

Die Simulation automatisch mehrfach eingestellt werden kann laufen und eine Karte für jeden Durchlauf erzeugen. Dies könnte Hunderte von Karten sein. Ich würde gerne die Karten zusammenfügen, um einen Film zu erstellen - die Interaktivität ist dafür nicht erforderlich. Bokeh verfügt über Funktionen zum Erstellen von PNG-Dateien über den Browser, so dass es möglich ist, jede Karte manuell als Datei zu speichern und mit ffmpeg einen Film zu erstellen. Dies ist jedoch nicht wirklich eine Option, wenn Sie es für Hunderte von Dateien tun müssen. Derzeit gibt es keine Möglichkeit, PNG-Dateien über Bokeh automatisch zu generieren, aber ich glaube, dass es irgendwann hinzugefügt wird.

Also brauche ich eine Abhilfe. Mein Gedanke ist, jede HTML-Datei von dem Ort zu öffnen, auf dem sie auf dem lokalen Laufwerk gespeichert sind, einen Screenshot zu machen, das Bild zu beschneiden, um den erforderlichen Abschnitt zu behalten und zu speichern. Aber ich habe noch keine Lösung gefunden, die funktioniert.

Beschneiden eines Bildes ist einfach:

from PIL import Image 

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

Mein Problem der HTML-Datei öffnet und den Screenshot in erster Linie unter dem obigen Code einzuspeisen.

Dafür habe ich Folgendes versucht, aber beide erfordern eine URL anstelle einer HTML-Datei. Auch beide benutzen Firefox, der für mich nicht funktioniert, aber ich habe Chrome installiert und den Code entsprechend geändert.

How to take partial screenshot with Selenium WebDriver in python?

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

für diese Mein Code ist:

from selenium import webdriver 

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

Welche zurück:

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

eindeutig ein Dateiname nicht eine URL ist, so dass klar ist. Es funktioniert gut, wenn Sie eine Website übergeben. Jede Hilfe bei der Erstellung eines HTML-Dokuments und einer Aufnahme wäre sehr willkommen! Es muss Selen nicht beinhalten.

+0

Welches Betriebssystem laufen Sie? – zhqiat

+0

Ubuntu 14.04 und Windows. – Pete

+0

Ich würde hoffen, dass ein Bokeh Person eine Methode für Sie hat; aber ich würde empfehlen, qt's qwebview verwenden, um Ihre HTML zu rendern, und greifen Sie das Fensterbild http://StackOverflow.com/Questions/24413385/pyqt4-qwidget-save-as-image – mdurant

Antwort

4

Ab Bokeh 0.12.6 ist es nun einfacher, diese Screenshots aus Python direkt zu nehmen, ohne einen Browser öffnen zu müssen.

PNGs exportieren sieht wie folgt aus

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

Und SVGs Export sieht wie folgt aus

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

Es gibt einige optionale Abhängigkeiten, die installiert werden müssen. Weitere Informationen finden Sie in der Exporting Plots section of the User Guide.

+0

IMO sollte dies die neue angenommene Antwort – bigreddot

+0

vereinbart und geändert werden – Pete

0

Wenn Sie Linux ausführen, müssen Sie möglicherweise die folgenden Schritte ausführen.

Zuerst öffnen Sie die HTML-Datei über command line in der Standard-App. Sie werden wahrscheinlich so etwas wie

import os 

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

Nutzung zu tun haben, die solution listed den Screenshot zu nehmen.

Dann die Verarbeitung in PIL wie vorgeschlagen.

Wenn Sie dies in Windows tun,

Sie können die AutoIT Treiber einrichten möchten, so dass Sie Ihre Python-Skript verwenden können GUI-Fenster usw. zu manipulieren

2

Sie können SimpleHTTPServer verwenden, um einen grundlegenden Webserver zu erstellen und Ihre lokale Datei verfügbar zu machen.

Sie sollten dies in den Weg laufen, wo die HTMT ist python -m SimpleHTTPServer 8000

Dann einfach driver.get('file_name')-driver.get('localhost:8000/file_name.html')

ändern Ich empfehle Ihnen zu verwenden „warten, bis“ sicherzustellen, dass alles sein wird geladen, bevor nehmen die Screenshot:

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

2

hgazibara Kommentar erwies sich als die einfachste f sein ix. Einige vereinfachten Code ist unten, um die Antwort bereitzustellen. Es wäre schön, wenn sich die Webseite nicht selbst zeigen müsste, um den Screenshot aufnehmen zu können. Ich werde sehen, ob ich das später hinzufügen kann.

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')