java用BufferedImage和Graphics画图传到页面背景为黑色如何设置成透明的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java用BufferedImage和Graphics画图传到页面背景为黑色如何设置成透明的相关的知识,希望对你有一定的参考价值。

java用BufferedImage和Graphics画图传到页面背景为黑色如何设置成透明的,代码如下

int width = 200;
int height = 200;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.YELLOW);
g.fillOval(0,0, width, height);
g.dispose();
try
ImageIO.write(image, "JPEG", response.getOutputStream());

BufferedImage单独显示就是黑色的,但是你可以在上面画各种颜色的东西,
你导入的图片是白色就是白色,不会被覆盖的

如果你不想要黑色,你就弄一张白色的图片覆盖在
BufferedImage上就行了
参考技术A 看 Oracle 官方教程

http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html

它提到了,透明是指 Color 的 alpha 小的值,比如 0 就是完全透明,255 是完全不透明。

Color bgColor = new Color(200, 0, 0, 0); 就是红色透明。
参考技术B Graphics画的背景图不能实现Opuper透明功能,只能用setBackGround的方法。
JFrame jf=new JFrame();
jf.setBounds(new Retangle(100,100,600,400));
JDeskPane jd=new JDeskPane();
jd.setSize(600,400);
Image im=ImageIcon.getImage(this,class.getResource("图片路径"));
JLabel jl=new JLabe();
jl.setIcon(im);
jd.setBackGround(jl);
jf.getContentPane(jd);
jf.setVisible(true);
参考技术C 要透明的前提是图片格式要是png的。。 参考技术D 类型 TYPE_INT_ARGB
输出 PNG本回答被提问者采纳

透明PNG - BufferedImage 包含不存在的像素 - java

【中文标题】透明PNG - BufferedImage 包含不存在的像素 - java【英文标题】:Transparent PNG - BufferedImage contains not existing pixels - java 【发布时间】:2021-07-12 18:30:08 【问题描述】:

我有 BufferedImage 和方法 getRGB(...) 显示我在 1959 年位置 456 的像素,但我在任何图像编辑器中都看不到这个位置的任何颜色。 我有两张透明的图像。 ImageOne 是在我的 java 应用程序中创建的。 ImageTwo 是 ImageOne(ImageOne 在 Affinity Photo 中打开并保存为 ImageTwo,没有任何更改)。

如果我在任何图像编辑器中打开 ImageOne 或 ImageTwo,我可以看到两个相同的图像。 要下载的图片:ImageOne + ImageTwo 或 HERE 或 HERE

但在 java 应用程序中,图像似乎是不同的。此代码打印像素 456、1959 的 RGB 颜色

    private static void testImage() 
    try 
        File fOne = new File("d:\\test\\ImageOne.png");
        File fTwo = new File("d:\\test\\ImageTwo.png");
        
        BufferedImage imageOne = ImageIO.read(fOne);
        BufferedImage imageTwo = ImageIO.read(fTwo);
        
        Color cOne = new Color(imageOne.getRGB(456, 1959));
        System.out.println("imageOne = " + cOne.getRGB() + " RGBA = " + cOne.getRed() + "," + cOne.getGreen() + "," + cOne.getBlue() + "," + cOne.getAlpha());
        
        Color cTwo = new Color(imageTwo.getRGB(456, 1959));
        System.out.println("imageTwo = " + cTwo.getRGB() + " RGBA = " + cTwo.getRed() + "," + cTwo.getGreen() + "," + cTwo.getBlue() + "," + cTwo.getAlpha());
        
     catch (IOException e) 
        e.printStackTrace();
    

结果是:

imageOne = -8355712 RGBA = 128,128,128,255
imageTwo = -16777216 RGBA = 0,0,0,255

是否可以从这些“不可见”像素中清除 BufferedImage? 你知道为什么 ImageOne 中有像素,为什么我只能在 java 中看到它吗?为什么图像编辑器的像素“不可见”? 谢谢。

【问题讨论】:

您的代码有一个(非常容易理解的)缺陷,因为您使用带有单个 int 参数的 Color 构造函数。此构造函数丢弃 alpha 分量(“创建不透明的 sRGB 颜色...Alpha 默认为 255”)。确实是一个非常令人困惑的 API。因此,您 打印像素的实际 alpha 值。更改为new Color(imageOne.getRGB(456, 1959), true) 以获得正确的值。最有可能的是,像素是透明的,即使@Hiran 的答案中给出的解释不正确。 ???? 【参考方案1】:

我认为这是完全合法的。 Alpha 通道为 255,这意味着墨水是完全透明的。

根据https://www.w3.org/TR/PNG-DataRep.html#DR.Alpha-channel,这个假设是错误的: alpha 值为零表示完全透明,值 (2^bitdepth)-1 表示完全不透明像素。

这意味着我无法解释为什么在图形程序中图片应该看起来一样 - 这是最初描述的症状。

【讨论】:

“你的 alpha 通道是 255,这意味着墨水是完全透明的。” 实际上,它是相反的。 255 或 0xFF 表示完全不透明。 0 是透明的。

以上是关于java用BufferedImage和Graphics画图传到页面背景为黑色如何设置成透明的的主要内容,如果未能解决你的问题,请参考以下文章

用BufferedImage加载图片

使用 AffineTransform 旋转图像

关于JAVA的问题:如何将BufferedImage转换为Image

Java BufferedImage / Android 位图

Java——BufferedImage操作实例

Java——BufferedImage对象