是否可以在将图像绘制到画布时调整图像的alpha值?
public void drawImg(Graphics g) {
g.drawImage(img, 0, 0, null);
}
“img”是声明为本地文件的Image对象。如果这不可能,是否可以更改“img”的alpha而不实际更改源文件?提前谢谢。
答案 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
,您可以根据需要进行修改。