簡體   English   中英

JFrame使用Alpha通道繪制動畫gif圖像

[英]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。

  1. 覆蓋getWidthgetHeight以返回圖像的大小。
  2. 不要調用super.paintComponent() -在這種情況下是多余的。
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM