使用Java中的createImage调整图像不透明度

时间:2011-08-16 19:13:08

标签: java canvas applet

是否可以在将图像绘制到画布时调整图像的alpha值?

public void drawImg(Graphics g) {
    g.drawImage(img, 0, 0, null);
}

“img”是声明为本地文件的Image对象。如果这不可能,是否可以更改“img”的alpha而不实际更改源文件?提前谢谢。

2 个答案:

答案 0 :(得分:1)

对于大多数使用Java代码进行图像淡入淡出的开发人员来说,这是一个简单快捷的方法。

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 *
 * @author ADMIN
 */
public class ImageFade extends JFrame {

    ImageFade() {
        setLayout(null);

        JLabel l = new JLabel();
        l.setBounds(0, 0, 100, 96);
        add(l);

        Thread tp = new Thread() {
            @Override
            public void run() {
                for (int amp = 0; amp <= 500; amp++) {
                    try {
                        sleep(1);
                        try {
                            BufferedImage bim = ImageIO.read(new File("src/image/fade/image.png"));
                            BufferedImage nbim = new BufferedImage(bim.getWidth(), bim.getHeight(), BufferedImage.TYPE_INT_ARGB);
                            Graphics2D createGraphics = nbim.createGraphics();
                            createGraphics.drawImage(bim, null, 0, 0);
                            RescaleOp r = new RescaleOp(new float[]{1f, 1f, 1f, (float) amp / 500}, new float[]{0, 0, 0, 0}, null);
                            BufferedImage filter = r.filter(nbim, null);
                            l.setIcon(new ImageIcon(filter));
                        } catch (Exception ex) {
                            System.err.println(ex);
                        }
                    } catch (InterruptedException ex) {
                    }
                }
            }
        };
        tp.start();

        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        setSize(100, 96);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setAlwaysOnTop(true);
    }

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

在此代码中,您可以看到线程代码。在线程中此图像将淡入。

使用的图像是堆栈溢出网页的徽标图像。

只有通过显示的代码,图像才会淡入。

Thread tp = new Thread() {
    @Override
    public void run() {
        for (int amp = 0; amp <= 500; amp++) {
            try {
                sleep(1);
                try {
                    BufferedImage bim = ImageIO.read(new File("src/image/fade/image.png"));
                    BufferedImage nbim = new BufferedImage(bim.getWidth(), bim.getHeight(), BufferedImage.TYPE_INT_ARGB);
                    Graphics2D createGraphics = nbim.createGraphics();
                    createGraphics.drawImage(bim, null, 0, 0);
                    RescaleOp r = new RescaleOp(new float[]{1f, 1f, 1f, (float) amp / 500}, new float[]{0, 0, 0, 0}, null);
                    BufferedImage filter = r.filter(nbim, null);
                    l.setIcon(new ImageIcon(filter));
                } catch (Exception ex) {
                      System.err.println(ex);
                  }
            } catch (InterruptedException ex) {
            }
        }
    }
};
tp.start();

此代码非常易于使用。

这不是来自任何书本,互联网等,而是我开发的。

正常图像无法更改Alpha。通过代码BufferedImage nbim = new BufferedImage(bim.getWidth(), bim.getHeight(), BufferedImage.TYPE_INT_ARGB);,图像将转换为ARGB-Alpha,Red,Green,Blue(R,G,B,A)图像。

因此您可以更改图像的Alpha。

答案 1 :(得分:0)

如果您的图片已经包含与之关联的Alpha数据,您应该可以直接绘制它。您可能必须为正在绘制的对象执行setOpaque(true),以便alpha正确显示。(这仅适用于Swing组件,您不应使用AWT中的Canvas除非你绝对必须)。

您也可以修改内存中的图像,只要您不将图像写回磁盘,它就不会永久更改。如果您通过ImageIO.read()加载图片,则会返回BufferedImage,您可以根据需要进行修改。