2014-09-27 80 views
0

我正试图在JFrame上绘制一个动画gif图像。目前,这是我正在做它:JFrame绘制带有alpha通道的动画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。

+0

请编辑您的问题包括[完整的示例](HTTP://计算器。 com/help/mcve),它展示了你描述的问题。在[完整示例](http://stackoverflow.com/help/mcve)中,通过URL访问映像,如[此处](http://stackoverflow.com/a/10862262/230513) – trashgod 2014-09-27 17:50:13

+0

I我补充了更多关于我的意思的信息。我想我只需要使用RGBA而不是RGB,但我不认为这是可能的... – user3746721 2014-09-27 18:03:36

回答

1

我根本无法使用您的手指绘制图像。您的类按原样为组件的宽度和高度返回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值,所以我想有一个与你的形象问题......

+0

它的绘制对我来说很好。我使用HTTP GET方法从服务器获取图像,然后缓存来自InputStream的数据并将字节数组传递给JImageComponent构造函数。你能告诉我一个它为你工作的图像吗? – user3746721 2014-09-27 19:27:49

+0

请先用我的代码试用吧 – Elist 2014-09-27 19:30:14

+0

哦哇,我真的很笨。我在白色背景上查看图像,因此颜色混合良好。你是正确的,每个像素的alpha值是1 ......我应该在发布前自己做这个。我道歉。 – user3746721 2014-09-27 19:32:03