Java 在BG为JPEG的情况下组合图像会导致意外结果
为什么组合BG为JPEG的图像会导致意外结果 这是我在本报告中回答的后续问题。发布在那里的源(使用内存中创建的BG映像)如下所示:Java 在BG为JPEG的情况下组合图像会导致意外结果,java,image,javax.imageio,Java,Image,Javax.imageio,为什么组合BG为JPEG的图像会导致意外结果 这是我在本报告中回答的后续问题。发布在那里的源(使用内存中创建的BG映像)如下所示: BG图像在左边 FG图像(具有透明度的PNG)在中间。 组合图像位于右侧 到目前为止,一切顺利。但后来问这个问题的人评论说,如果BG是JPEG,它就失败了。认为他们错了,我修改了我的示例,将BG图像编码为JPEG。现在,如果我使用BufferedImage.TYPE_INT_ARGB或BufferedImage.TYPE_INT_RGB作为最终图像,我会得到
- BG图像在左边
- FG图像(具有透明度的PNG)在中间。
- 组合图像位于右侧
BufferedImage.TYPE_INT_ARGB
或BufferedImage.TYPE_INT_RGB
作为最终图像,我会得到他们所指的:
TYPE\u INT\u ARGB
TYPE\u INT\u RGB
我希望至少其中一个的结果与原始结果相同(更重要的是ARGB
变体)
gui.repaint()
因为在构造joptionpane时有效地绘制了面板和组件,所以请稍后再试,但是,即使如此,因为构造线程匹配可见性调用也不会成立,所以无论如何,在joptionpane调用之后,您应该在绘制覆盖方法中调用g.drawImage
它无法绘制屏幕上还不存在的东西,但是调用是可以容忍的,因为理论上它是作为一组对象存在的,足够用于该方法。看起来这是由于输入错误造成的 在您的引用中,构成组合图像的代码是
Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImage, 0, 0, null);
g.drawImage(fgImage, 0, 0, null);
但在这个问题上,它被改为
Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImageJpeg, w, h, null);
g.drawImage(fgImage, w, h, null);
后者从右下角开始绘制,这恰好是图像的右下角,因此没有真正绘制任何内容。然而,前者如预期的那样绘制了整个图像。您完全正确。我不知道那个错误是怎么发生的,但是谢谢你发现了我(愚蠢的)错误P
Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImageJpeg, w, h, null);
g.drawImage(fgImage, w, h, null);