【问题标题】:JPanel - drawing a black transparent png with 50% opacityJPanel - 绘制一个不透明度为 50% 的黑色透明 png
【发布时间】:2017-05-20 04:02:27
【问题描述】:

让我用照片问我的问题:)

左边的图片是Adobe Photoshop中的透明照片,右边是我的java程序中的结果。 我在重写的“paint(Graphics g)”方法的主体中使用了“drawImage”方法。 我怎样才能让它看起来透明? 看起来这里只有 0 或 100 的透明度是可以接受的......

【问题讨论】:

  • 图像是 JPG(坏)还是 PNG(好)?请出示相关代码。
  • @DontKnowMuchButGettingBetter 黑色部分是透明的,我在标题中也注意到了,所以它绝对是png图片!!!
  • 查找AlphaComposite - Compositing Graphics

标签: java swing jframe jpanel paint


【解决方案1】:

也许你正在寻找这样的东西:

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.event.*;

public class TransparentImage extends JPanel
{
    private BufferedImage backImage, frontImage;
    private float alpha = 1;

    public TransparentImage()
    {
        try
        {
//          backImage = ImageIO.read(new File("mong.jpg") );
            backImage = ImageIO.read(new File("grass.jpg") );
            frontImage = ImageIO.read(new File("dukeWaveRed.gif") );
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(backImage.getWidth(), backImage.getHeight());
    }

    public void setAlpha(float alpha)
    {
        this.alpha = alpha;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        //  Paint background image

        Graphics2D g2 = (Graphics2D) g;
        int x = (getWidth() - backImage.getWidth())/2;
        int y = (getHeight()- backImage.getHeight())/2;
        g2.drawRenderedImage(backImage, AffineTransform.getTranslateInstance(x, y));

        //  Paint foreground image with appropriate alpha value

        Composite old = g2.getComposite();
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        x = (getWidth() - frontImage.getWidth())/2;
        y = (getHeight()- frontImage.getHeight())/2;
        g2.drawRenderedImage(frontImage, AffineTransform.getTranslateInstance(x, y));
        g2.setComposite(old);
    }

    private static void createAndShowUI()
    {
        final TransparentImage app = new TransparentImage();

        JSlider slider = new JSlider();
        slider.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent e)
            {
                JSlider source = (JSlider) e.getSource();
                app.setAlpha(source.getValue()/100f);
            }
        });
        slider.setValue(100);

        JFrame frame = new JFrame("Transparent Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( app );
        frame.add(slider, BorderLayout.SOUTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

提供背景和前景图像。使用滑块调整前景图像的 alpha 值。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2023-02-21
    • 2012-02-22
    • 2012-06-25
    • 2013-07-20
    • 2023-03-09
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多