Java:用透明像素填充缓冲图像

2022-09-02 08:56:21

我有一个屏幕外的BufferedImage,用类型构建。它可以包含任何东西,我正在寻找一种方法(相当有效地)用透明像素完全覆盖图像,从而产生“不可见”的图像。BufferedImage.TYPE_INT_ARGB

使用类似如下的内容:

    (bufimg.getGraphics()).setColor(new Color(10, 10, 100, 0));   
    (bufimg.getGraphics()).fillRect (0, 0, x, y);

没有效果。一种可能的方法可能是覆盖BufferedImage中的每个像素,但我不确定这是最好的解决方案。你会怎么做?

[编辑]
图形文档建议不要对屏幕外图像使用 clearRect,但我已尝试了与上述相同的结果。

[编辑2]
在尝试了MeBigFatGuy的代码之后(谢谢!),它确实清除了图像。但它也停止了对该图像的进一步绘画(或似乎)。例如,此代码:

    BufferedImage img = new BufferedImage (600, 600, BufferedImage.TYPE_INT_ARGB);
    Graphics g = img.createGraphics ()    
    g.drawLine (100, 100, 500, 500);
    AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f);
    g.setComposite(composite);
    g.setColor(new Color(0, 0, 0, 0));
    g.fillRect(0, 0, 600, 600);
    graphicsAI.setColor(new Color (10, 10, 10, 255));
    graphicsAI.drawLine (100, 100, 500, 500);

导致图像上看不到任何内容(我正在将图像绘制到JPanel)。这是否与 Alpha 值的添加有关?


答案 1

使用CLEAR合成清除背景后,需要将其设置回SRC_OVER才能再次正常绘制。前任:

//clear
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
g2.fillRect(0,0,256,256);

//reset composite
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
//draw
g2.setPaint(Color.RED);
g2.fillOval(50,50,100,100);

答案 2

您可以获取您的底层数组(确保使用兼容的格式:即,由 一个由 支持的格式)。int[]BufferedImageint[]

然后用 alpha 值为 0 的 ints 填充 (0 将执行 ; )int[]

A会很快System.arraycopy

你必须知道,直接写入比使用setRGB得多int[]

现在在Java中有点黑魔法:根据你正在做的事情以及你正在做的平台/ JVM,你可能会失去硬件加速(无论如何,这可能从未存在过)。除此之外,您可能根本不关心硬件加速,因为您可能没有在开发需要60 + FPS才能玩的游戏等。BufferedImage

这是一个非常复杂的话题,剥猫皮的方法不止一种。就我而言,当我必须在像素级别混乱时,我直接工作,因为我认为这比尝试使用更高级的绘图基元更有意义,而且我真的不关心硬件加速的潜在损失。BufferedImageint[]


推荐