【问题标题】:How to get rid of a color in an image如何去除图像中的颜色
【发布时间】:2013-04-28 19:20:36
【问题描述】:

我希望我的图像,一个缓冲图像,具有透明背景,我首先尝试使用 png,然后是 gif,然后我尝试使用 imageFilters,但我也无法成功,所以现在我决定使用简单的 jpeg,将背景设置为一种颜色,然后去掉该颜色,我再次假设 imageFilters 适合它,但我不知道如何使用它们,我想去掉的颜色是 0xff00d8 (洋红色)。

任何人都可以提供一种方法或示例吗?

【问题讨论】:

    标签: java image swing image-processing transparency


    【解决方案1】:

    jpeg 不支持透明度。确保您的缓冲图像也支持透明度:

    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    

    TYPE_INT_ARGB 中的 A 代表 alpha,它是不透明度的度量。

    您需要将像素值设置为 0x00000000 以使其透明。

    //Load the image
    BufferedImage in = ImageIO.read(img);
    int width = in.getWidth(), height = in.getHeight();
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bi.createGraphics();
    g.drawImage(in, 0, 0, null);
    g.dispose();
    
    //Change the color
    int colorToChange = 0xff00d8;
    for (int x=0;x<width;x++)
        for (int y=0;y<height;y++)
            if(bi.getRGB(x,y)==colorToChange)
                bi.setRGB(x,y,0x00FFFFFF&colorToChange);
    
    bi.save(new File("out.png"));
    

    【讨论】:

    • 好的,所以现在我回到 png,添加了 ARGB,但如果我这样做,我所有的图像都会变成灰色,所以我认为我需要做更多的事情,但我没有知道如何从一个精确的像素中选择一种颜色并将该颜色的所有像素转换为 0x00000000,我看了很多方法但找不到任何东西,你能帮我吗?非常感谢大家的帮助
    • 谢谢,我试过了,但是保存不起作用,试图只放你叫bi的图像,而不是原来的也不起作用,并且在透明的地方给出相同的颜色应该是
    • 你是如何输出图像的?
    • 我首先像这样读取图像: image =ImageIO.read(new File("adam.png"));然后我通过一个像这样扩展JPanel的ImagePanel输出它:ImagePanel imagePanel = new ImagePanel(bi);它使用这种方法: public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, getWidth(), getHeight(), this); }
    • JPanel 本身不支持透明背景。见stackoverflow.com/a/10059218/895876
    【解决方案2】:

    我设法使用 JWindow 修复了它,不过,感谢 Jason 的所有帮助

    我有一个扩展 JPanel 的 translucentPane :

    public TranslucentPane() {
        setOpaque(false);
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
    
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f));
        g2d.setColor(getBackground());
        g2d.fillRect(0, 0, getWidth(), getHeight());
    
    }
    

    然后我在我的主 UI 中执行此操作:

    robotUI roboUI = new robotUI();
        roboUI.setBackground(new Color(0,0,0,0));
    

    我的内容窗格是:

    TranslucentPane pane = new TranslucentPane();
    

    我希望这足以让任何人理解

    【讨论】:

    • 作为答案,这并没有提供足够的细节让其他人从中受益。能否附上代码示例?
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2018-06-24
    • 2018-10-21
    • 2019-01-13
    • 2011-07-27
    • 2020-01-05
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多