gpt4 book ai didi

java - JFrame 使用 Alpha channel 绘制动画 gif 图像

转载 作者:行者123 更新时间:2023-12-01 12:29:17 25 4
gpt4 key购买 nike

我正在尝试在 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 channel 。我不知道如何使图像使用 32 位颜色模型,并使用 8 个最高有效位作为 alpha 值。任何帮助表示赞赏!谢谢。

编辑:当我尝试使用 ImageIO 和 BufferedImage 时,它​​没有动画。显然这是因为它没有更新 ImageObserver

编辑:这是有背景时图像的样子:http://puu.sh/bQ5sZ.png我不想要那个白边,它应该看起来像这样:http://puu.sh/bQ5Ya.png 。正如我之前所说,我知道为什么会发生这种情况;我需要 Image 类来使用 RGBA 而不是 RBG。

最佳答案

我根本无法使用你的 cade 来绘制图像。您的类按原样为组件的宽度和高度返回 1。

  1. 重写 getWidthgetHeight 以返回图像的大小。
  2. 不要调用 super.paintComponent() - 在这种情况下它是多余的。
  3. drawImage 接收图像最左侧、最顶部的坐标,因此您可以简单地使用 0, 0 来调用它。

这段代码为我绘制了正确的 Alpha channel :

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 值,所以我猜您的图像有问题......

关于java - JFrame 使用 Alpha channel 绘制动画 gif 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com