[英]JFrame drawing an animated gif image with an alpha channel
我正在嘗試在JFrame上繪制動畫gif圖像。 目前,這是我的操作方式:
public class JImageComponent extends JComponent {
private static final long serialVersionUID = -6926323540532721196L;
private final Image image;
public JImageComponent(Image image) {
this.image = image;
}
public JImageComponent(byte[] data) {
this(Toolkit.getDefaultToolkit().createImage(data));
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
final int centerX = getWidth() / 2 - image.getWidth(this) / 2;
final int centerY = getHeight() / 2 - image.getHeight(this) / 2;
graphics.drawImage(image, centerX, centerY, this);
}
}
但是,這很好(因為邊緣有陰影),如果我設置了背景顏色,則顯示令人討厭的白色邊緣。 我想我知道是什么原因造成的,這是因為Image類沒有利用Alpha通道。 我不知道如何使用8位最高有效位作為alpha值使圖像使用32位顏色模型。 任何幫助表示贊賞! 謝謝。
編輯:當我嘗試使用ImageIO和BufferedImage時,它沒有動畫。 顯然這是因為它不會更新ImageObserver
編輯:這是有背景時圖像的外觀: http : //puu.sh/bQ5sZ.png我不想要白色邊緣,它應該看起來像這樣: http : //puu.sh/bQ5Ya。 png 。 就像我之前說的,我知道為什么會這樣。 我需要Image類來使用RGBA而不是RBG。
我根本無法使用您的cade繪制圖像。 照原樣,類的寬度和高度都返回1。
getWidth
和getHeight
以返回圖像的大小。 super.paintComponent()
-在這種情況下是多余的。 drawImage
接收圖像的最左,最頂坐標,因此您可以簡單地用0,0調用它。 這段代碼為我繪制了Alpha通道:
public class JImageComponent extends JComponent {
private static final long serialVersionUID = -6926323540532721196L;
private final Image image;
public JImageComponent(Image image) {
this.image = image;
}
public JImageComponent(byte[] data) {
this(Toolkit.getDefaultToolkit().createImage(data));
}
@Override
protected void paintComponent(Graphics graphics) {
graphics.drawImage(image, 0, 0, null);
}
@Override
public int getWidth() {
return image.getWidth(null);
}
@Override
public int getHeight() {
return image.getHeight(null);
}
}
編輯:
我之前的代碼仍然為您的圖像顯示白色背景,因此我挖了一個北斗七星並迭代每個像素:
public class JImageComponent extends JComponent {
private static final long serialVersionUID = -6926323540532721196L;
private final Image image;
public JImageComponent(Image image) {
this.image = image;
}
public JImageComponent(byte[] data) {
this(Toolkit.getDefaultToolkit().createImage(data));
}
@Override
protected void paintComponent(Graphics graphics) {
Graphics2D g2 = (Graphics2D) graphics.create();
int[] pixels = new int[image.getWidth(null)*image.getHeight(null)];
PixelGrabber pg =
new PixelGrabber(image, 0, 0, image.getWidth(null), image.getHeight(null), pixels, 0, image.getWidth(null));
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("interrupted waiting for pixels!");
return;
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("image fetch aborted or errored");
return;
}
for (int i = 0 ; i < image.getWidth(null) ; i++) {
for (int j = 0 ; j < image.getHeight(null) ; j++) {
handlesinglepixel(i, j, pixels[j * image.getWidth(null) + i], g2);
}
}
}
@Override
public int getWidth() {
return image.getWidth(null);
}
@Override
public int getHeight() {
return image.getHeight(null);
}
public void handlesinglepixel(int x, int y, int pixel, Graphics2D g2d) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;
Color color = new Color(red,green,blue);
g2d.setColor(color);
System.out.println("Alpha value is " + (float)(alpha/255));
g2d.setComposite(AlphaComposite.SrcAtop.derive((float)(alpha/255)));
g2d.drawRect(x, y, 1, 1);
}
}
這會為每個像素打印一個1.0
alpha值,所以我想您的圖像有問題...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.