2017-01-02 7 views
-1

Итак, я делаю приложение stopmotion - живой канал с моей веб-камеры находится внутри JPanel (с setOpaque (false)), который находится внутри верхнего (10-го) уровня в JLayeredPane - и в основном, когда я делаю снимок, я хочу добавить его в один из нижних слоев, чтобы на экране отображалась трассировка предыдущих изображений. Вот как я пытаюсь это сделать сейчас:Добавить прозрачное изображение в JLayeredPane

EDIT: это мой новый код, основанный на ответе ниже - это теперь ничего не делает, а не просто добавляет непрозрачное изображение, как раньше - если я добавлю это к JPanel, хотя и добавьте JPanel в JLayeredPane, то все, что я получаю серый

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 это картина, которую я только что захватил с веб-камеры, и я пытаюсь сделать его полупрозрачным , затем добавьте его в JLabel. Как я могу сделать эту работу? Или есть лучший способ сделать это?

ответ

1

Я не знаю, если это решит проблему, но изображение, которое вы ищете является

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

java.awt.Transparency.TRANSLUCENT имеет значение 3 и соответствует BufferedImage.TYPE_INT_ARGB_PRE, которые только Бог знает, что он делает.

С BufferedImage.TYPE_INT_ARGB вы можете создать прозрачное изображение и применить композитный и т.д.

Кроме того, необходимо, чтобы исправить это

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

в

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

-

ЭРВО как прозрачность работает для меня:

У меня есть два изображения BIM и bim2 и я рисую один на другой:

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

Тогда я могу отобразить его на JPanel JFrame или любой другой.

Я могу даже создать ярлык:

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

Got это - только теперь, когда я добавляю его, ничего не отображается - если я не добавить его в JPanel, в случае чего (после того, как я panel.setBackground (новый цвет (0,0,0, 50)) на экране появляется только серый цвет. Невозможно ли в JLayeredPane сделать прозрачный слой более прозрачным и увидеть слой под ним? – dgamz

+0

теперь я замечаю: вам нужно иметь еще один изображение, которое вы не можете нарисовать пустым изображением (img2) для себя - каково изображение с веб-камеры? – gpasch

+0

Изображение с веб-камеры называется img - хотя я не пытаюсь изменить это, поскольку я его где-то храню еще нетронутым - я бы хотел сделать копию img, а затем сделать эту копию полуторной nsparent – dgamz