当前位置: 首页 > 面试题库 >

Java:使用透明像素填充BufferedImage

金和雅
2023-03-14
问题内容

我有一个屏幕外的BufferedImage,它是用type构造的BufferedImage.TYPE_INT_ARGB。它可以包含任何内容,我正在寻找一种方法(相当有效)用透明像素完全覆盖图像,从而生成“不可见”图像。

使用这样的东西:

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

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

[编辑]
图形文档建议不要将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);

结果在图像上什么都看不到(我正在将图像绘制到JPanel上)。这与添加alpha值有关吗?


问题答案:

您可以获得您的基础int[]数组(请BufferedImage确保使用兼容的格式:即以表示支持的格式int[])。

然后int[]用alpha值为0的int 填充(0可以;)

A System.arraycopy非常 快。

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

现在BufferedImage,Java有点荒唐了:根据您正在执行的工作以及在哪个平台/ JVM上进行操作,您 可能会 失去硬件加速(反之,它们
可能 从来没有出现过)。除此之外,您可能还是根本不关心硬件加速,因为您可能没有在玩需要60+ FPS的游戏等。

这是一个 非常
复杂的主题,并且有多种方法可以给BufferedImage猫皮剥皮。就我而言,我直接在int[]需要弄乱像素级别的地方工作,因为我认为这比尝试使用更高级别的绘图基元更有意义,而且我
确实 不在乎潜在的硬件加速损失。



 类似资料:
  • 现在的问题是:我有一个由第三方创建的XFA表单,我想按原样使用它。我可以通过以下方式生成带有填充字段的PDF: 我想做的只是在第二页上盖上一个图像/水印,它有一个包含多个字段的表单。我正在冲压的“草稿”png图像有一个透明的背景,所以如果覆盖工作,图像背景应该使衬底出现,看起来像图像文本坐在pdf页面的顶部。 如果这不是一个XFA表单,我想要完成的将是微不足道的。我只需要使用iText的pdfSt

  • 现在,我尝试执行泛洪填充算法来填充透明的PNG图像,使用文章中的泛洪填充算法如何避免在泛洪填充算法期间超过最大调用堆栈大小?使用非递归方法和Uint32Array很好地处理颜色堆栈。 但是,此整体填充算法保留了未填充的白色(实际上是浅灰色边或抗锯齿边)。这是我的代码: 到目前为止,我已经尝试使用以下建议: 使用matchOutlineColor函数,使用画布中提到的RGBA值-泛光填充在边缘留下白

  • 我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:

  • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

  • 因此,我正在创建一个代表自动售货机的GUI。我只是遇到了一些问题,试图让布局按我想要的方式工作。我的想法是在JLabel中插入一个图像,然后在特定位置用透明JButton覆盖该图像,这样当您在特定位置单击图像时,它将触发JButton。我还没有达到透明性,因为我目前正专注于如何将JButton精确地放置在需要的位置。 我已经尝试过setLoctionandsetBound,但没有成功。任何关于如何

  • 我正在处理位图图像的透明部分用洋红色着色(在一些语言中,可以将颜色设置为透明)。我试图在原始位图图像中透明洋红色的像素。 我从SD卡加载位图: 将其复制到另一个位图以使其可变: 然后逐像素扫描,找到洋红色的像素,并尝试改变它们的透明度。 但是那些我希望变成透明的像素被转换成黑色。通过更改alpha,我发现最终颜色从中提到的颜色(不提及alpha)变为黑色。例如,变为白色,为灰色,而变黑。 我不知道