Java:使用透明像素填充BufferedImage

JBe*_*son 19 java transparency bufferedimage image

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

使用这样的东西:

    (bufimg.getGraphics()).setColor(new Color(10, 10, 100, 0));   
    (bufimg.getGraphics()).fillRect (0, 0, x, y);
Run Code Online (Sandbox Code Playgroud)

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

[edit]
图形文档建议不要将clearRect用于屏幕外图像,但我尝试使用与上面相同的结果.

[edit2]
在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

结果没有在图像上看到(我正在将图像绘制到JPanel).这是否与添加alpha值有关?

Jos*_*cci 24

使用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);
Run Code Online (Sandbox Code Playgroud)


Syn*_*r0r 9

你可以得到你的底层int[]数组BufferedImage(确保使用兼容的格式:即由a支持的格式int[]).

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

A System.arraycopy非常快.

你要知道,在直接写入int[]很多比使用更快setRGB.

现在BufferedImage是Java中的一种黑色艺术:取决于你正在做什么以及你正在做什么平台/ JVM,你可能会失去硬件加速(无论如何这可能永远不会出现在那里).除此之外,你可能根本不关心硬件加速,因为你可能没有工作,比如说需要60+ FPS才能玩的游戏等等.

这是一个非常复杂的话题,并且不止一种方法可以给BufferedImage猫皮肤涂抹.就我而言,我直接在int[]像素水平处理时,因为我觉得它比尝试使用更高级别的绘图原语更有意义,我真的不关心硬件加速可能会丢失.


MeB*_*Guy 5

如果将Graphics对象强制转换为Graphics2D对象,则可以设置Composite对象

AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f);
Graphics2D g2d = (Graphics2D) image.getGraphics();
g2d.setComposite(composite);
g2d.setColor(new Color(0, 0, 0, 0));
g2d.fillRect(0, 0, 10, 10);
Run Code Online (Sandbox Code Playgroud)