2012-09-14 22 views

risposta

1

È possibile Chroma Key la visualizzazione Web sui contenuti utilizzando gli effetti Blend.

Aggiornamento

ho provato questo fuori e l'attuazione di un vero Chroma Key con gli effetti di fusione built-in di JavaFX 2.2 in JavaFX è in realtà piuttosto difficile (e superato le mie capacità di attuazione). Sono riuscito a far funzionare la tecnica con i formati video flv con pre-chroma, ma non con nodi arbitrari come WebView.

Ancora, per ora, è possibile ottenere qualcosa di simile in un modo semplice usando gli effetti di scurire e schiarire come suggerisce il martini nella sua risposta. Non è perfetto, ma probabilmente dovrà essere sufficiente fino all'implementazione di RT-25004 o la piattaforma JavaFX fornisca un insieme più completo di operazioni di compositing alfa.

4

Se u avere uno sfondo luminoso utilizzare

webView.setBlendMode(BlendMode.DARKEN); 

e quando sfondo scuro, poi

webView.setBlendMode(BlendMode.LIGHTEN); 

Questo sarà probabilmente essere risolto in un certo tempo, questa funzione è richiesto sul JavaFX bug tracker #RT-25004

+0

Si lavora per me con JDK 8 (1.8.0_40-bis), ma non con JDK 7 (1.7.0_65) –

-1

Sto resuscitando questo perché ho trovato una soluzione migliore per il problema di avere un WebView su un gradiente t. Supponiamo di avere un gradient like this e si desidera visualizzare una stringa HTML sopra in colore bianco che sembra qualcosa di simile:

<p>Integer semper, est imperdiet mattis porttitor, massa vulputate ipsum</p> 

Il trucco è quello di convertire il gradiente a stringa Base64:

iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC 

Poiché WebView carica qualsiasi stringa HTML, questo può coinvolgere lo <body> con uno sfondo. Nel mio caso, lo WebView non occupava tutto lo spazio con il gradiente, quindi ho dovuto posizionare anche lo sfondo. Di seguito è riportato il codice HTML ho aggiunto alla stringa HTML sopra al beggining:

<html> 
<head> 
</head> 
<body style="margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;"> 
<span style="font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;"> 

E alla fine:

</span></body></html> 

Pertanto la produzione di tale codice:

String desc = "<html><head></head><body style=\"margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;\"><span style=\"font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;\">" + description + "</span></body></html>"; 
wv_desc.getEngine().loadContent(desc); 

Si potrebbe forse mettere gli stili nel <head> o li caricherò in un altro modo per chiarezza, suppongo, ma questo è un modo migliore di aggirare qualcos'altro che ho trovato in rete per questo problema.

7

Webview trasparente ottengo una buona soluzione qui: https://javafx-jira.kenai.com/browse/RT-29186 leggere i commenti Harry Hur

import java.lang.reflect.Field; 
    import javafx.application.Application; 
    import javafx.beans.value.ChangeListener; 
    import javafx.beans.value.ObservableValue; 
    import javafx.scene.Scene; 
    import javafx.scene.web.WebEngine; 
    import javafx.scene.web.WebView; 
    import javafx.stage.Stage; 
    import javafx.stage.StageStyle; 
    import org.w3c.dom.Document; ` 

    public class TestTranparentApps extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     new WebPage(primaryStage); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    class WebPage{ 

     WebView webview; 
     WebEngine webengine; 
     public WebPage(Stage mainstage){ 
      webview = new WebView(); 
      webengine = webview.getEngine(); 

      Scene scene = new Scene(webview); 
      scene.setFill(null); 

      mainstage.setScene(scene); 
      mainstage.initStyle(StageStyle.TRANSPARENT); 
      mainstage.setWidth(700); 
      mainstage.setHeight(100); 

      webengine.documentProperty().addListener(new DocListener()); 
      webengine.loadContent("<body style='background : rgba(0,0,0,0);font-size: 70px;text-align:center;'>Test Transparent</body>"); 
     } 

     class DocListener implements ChangeListener<Document>{ 
      @Override 
      public void changed(ObservableValue<? extends Document> observable, Document oldValue, Document newValue) { 
       try { 

        // Use reflection to retrieve the WebEngine's private 'page' field. 
        Field f = webengine.getClass().getDeclaredField("page"); 
        f.setAccessible(true); 
        com.sun.webkit.WebPage page = (com.sun.webkit.WebPage) f.get(webengine); 
        page.setBackgroundColor((new java.awt.Color(0, 0, 0, 0)).getRGB()); 

       } catch (Exception e) { 
       } 

      } 
     } 
    } 
} 
+0

È davvero fantastico! –

+0

'WebEngine.page' è definitivo, quindi è possibile eseguire la riflessione senza la necessità di ascoltare le modifiche del documento direttamente durante la creazione di WebView. Sebbene la mia versione (JDK 1.7.80) usi 'com.sun.webpane.platform', ma probabilmente è la stessa. – TWiStErRob

8

Questo potrebbe essere utile

final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine); 
webPage.setBackgroundColor(0); 
+0

perfetto. per rendere trasparente WebView basta solo due righe di codice. oppure puoi renderlo un liner 'com.sun.javafx.webkit.Accessor.getPageFor (webviewgetEngine()). setBackgroundColor (0)' – Vishrant