2017-01-02 4 views
-1

Also mache ich eine Stopmotion-Anwendung - der Live-Feed von meiner Webcam ist in einem JPanel (mit setOpaque (false)) innerhalb der obersten (10.) Ebene in einem JLayeredPane - und im Grunde, Wenn ich ein Bild mache, möchte ich es zu einer der unteren Ebenen hinzufügen, damit eine Spur der vorherigen Bilder auf dem Bildschirm angezeigt wird. Hier ist, wie ich versuche, das jetzt zu tun:Transluzentes Bild zu JLayeredPane hinzufügen

EDIT: das ist meine neue Code basierend auf der Antwort unten - das tut jetzt nichts, im Gegensatz zu nur das opake Bild wie zuvor hinzufügen - wenn ich das hinzufügen aber zu einem JPanel, hinzufügen und die JPanel zum JLayeredPane, dann alles, was ich bekommen ist grau

BufferedImage img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = img2.createGraphics(); 
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f));    

g.drawImage(img2, 0, 0, null); 
g.dispose(); 

ImageIcon imgIcon = new ImageIcon(new ImageIcon(img2).getImage().getScaledInstance(img2.getWidth(), img2.getHeight(), Image.SCALE_SMOOTH)); 
JLabel showPic = new JLabel(imgIcon); 
showPic.setSize(layers.getSize()); 
showPic.setBounds(layers.getX() + 18, layers.getY(), img2.getWidth(), img2.getHeight()); 

layers.add(showPic, new Integer(1)); //layers is my JLayeredPane 
layers.repaint(); 
layers.revalidate(); 

img ist das Bild, das ich von meiner Webcam gerade aufgenommen haben, und ich versuche, es zu machen, halbtransparent , dann füge es zu einem JLabel hinzu. Wie kann ich das schaffen? Oder gibt es einen besseren Weg, dies zu tun?

Antwort

1

Ich weiß nicht, ob dies das Problem lösen, aber das Bild von Ihnen gesuchte ist

BufferedImage img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); 

java.awt.Transparency.TRANSLUCENT den Wert von 3 hat und entspricht, die nur auf BufferedImage.TYPE_INT_ARGB_PRE Gott weiß, was es macht.

Mit BufferedImage.TYPE_INT_ARGB können Sie ein transparentes Bild erstellen und anwenden Composite-etc

Sie müssen auch diese

g.drawImage(img2, null, 0, 0); 

zu

g.drawImage(img2, 0, 0, null); 

korrigieren -

Heres wie Transparenz für mich funktioniert:

Ich habe zwei Bilder bim und bim2 und zeichne ich ein auf dem anderen:

BufferedImage bim=null, bim2=null; 
try { 
    bim=ImageIO.read(new File("....")); 
    bim2=ImageIO.read(new File("....")); 
} 
catch (Exception ex) { System.err.println("error in bim "+ex); } 
int wc=bim.getWidth(), hc=bim.getHeight(); 

BufferedImage img2 = new BufferedImage(bim.getWidth(), bim.getHeight(), BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = img2.createGraphics(); 
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f));    

g.drawImage(bim, 0, 0, null); 
g.drawImage(bim2, 0, 0, wc, hc, null); 

Dann kann ich es auf einem JPanel JFrame oder was auch immer angezeigt werden soll.

ich sogar das Label erstellen:

JLabel showPic = new JLabel(new ImageIcon(img2)); 
JFrame f=new JFrame(); 
f.setSize(500, 500); 
f.add(showPic); 
f.setVisible(true); 
+0

Verstanden - erst jetzt, wenn ich es hinzufügen, zeigt nichts auf - wenn ich es nicht zu einem JPanel, wobei in diesem Fall hinzufügen (nachdem ich tun panel.setBackground (new Color (0,0,0, 50)) nur Grau erscheint auf dem Bildschirm Ist es in einem JLayeredPane nicht möglich eine obere Ebene transparent zu machen und die darunter liegende Ebene zu sehen? – dgamz

+0

jetzt merke ich: du brauchst noch eine image du kannst kein leeres bild (img2) auf sich selbst zeichnen - was ist das bild von der webcam – gpasch

+0

Das Bild von der Webcam heißt img - obwohl ich nicht versuche das zu ändern, da ich es irgendwo abspeichere sonst intakt - ich möchte eine Kopie von img machen und dann diese Kopie halb-tra machen nsparent – dgamz