java - 图像填充后颜色不同

标签 java image graphics image-processing flood-fill

我一直在玩图像洪水填充 I found here on Stack Overflow .

我认为代码不是问题。如果你有更好的,我会很高兴看到(或者如果你知道一个有这种类型的图像处理的库,那就更好了)。

我的问题是,在我对这张图片运行算法后,这个人的 Helm 不是绿色而是浅灰色。

我已经在 Paint 中创建的一个愚蠢的示例上进行了尝试,它工作正常。 因此,我认为一定有一些图像设置或类似的东西改变了我在算法中设置的 rgb 值。

您对应该在代码中设置什么有什么建议(请参见下文)?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FloodFillTest extends JPanel
{
    private static final long serialVersionUID = 1L;
    private BufferedImage bI;
    public FloodFillTest()
    {
        try
        {
            this.bI = ImageIO.read(new File("images/brother.png"));
            Color targetColor = Color.WHITE;
            Color replacementColor = Color.GREEN;
            System.out.println("targetColor="+targetColor+"; replacementColor="+replacementColor);
            floodFill(125, 90, targetColor, replacementColor, bI);      
            setPreferredSize(new Dimension(bI.getWidth(), bI.getHeight()));
            System.out.println("bI.getWidth()="+bI.getWidth()+"; bI.getHeight()="+bI.getHeight());
        }catch(IOException ex)
        {
            Logger.getLogger(FloodFillTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   

    /**
     * Fills a color in the image with a different color.
     * @param x x coordinate of starting point.
     * @param y y coordinate of starting point.
     * @param targetColor color we want to replace.
     * @param replacementColor the color which is used as the replacement.
     * @param image the image where we fill the color.
     */
    public static void floodFill(int x, int y, Color targetColor, Color replacementColor,
            BufferedImage image)
    {
        if(image.getRGB(x, y) != targetColor.getRGB()) 
            return;
        image.setRGB(x, y, replacementColor.getRGB());
        System.out.println("after set image.getRGB(x,y)="+ new Color(image.getRGB(x,y)).toString());
        floodFill(x - 1, y, targetColor, replacementColor, image);
        floodFill(x + 1, y, targetColor, replacementColor, image);
        floodFill(x, y - 1, targetColor, replacementColor, image);
        floodFill(x, y + 1, targetColor, replacementColor, image);
    }
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);        
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(bI, 0,0, null);
    }   

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {               
                System.out.println("Color.WHITE="+Color.WHITE +"; Color.BLACK="+Color.BLACK);
                JPanel p = new FloodFillTest();
                p.setBackground(Color.CYAN);
                JPanel contentPane = new JPanel();
                contentPane.add(p);
                JFrame f = new JFrame();
                f.setContentPane(contentPane);
                f.setSize(800, 600);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}

这是我在测试中使用的图像。 The image I am using in tests .

最佳答案

那里有一张灰度图像。您不能在灰度图像上使用绿色。这就是它显示为浅灰色的原因。

您需要:

  • 预先将图像转换为 RGB
  • 确保在 Java 中将图像读取/转换为 RGB

最后一个选项更安全,因为它不会在未来的图像上失败。这是我在网上找到的一些代码,据说可以转换为灰度。稍作修改,您就拥有了确保处理彩色图像所需的一切:

public static BufferedImage convertToGrayscale(BufferedImage source) { 
     BufferedImageOp op = new ColorConvertOp(
       ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
     return op.filter(source, null);
}

关于java - 图像填充后颜色不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6099759/

相关文章:

java - 字符串分割方法在开头留下空标记

PHP MySQL 无法从数据库中找到我的图像

java - 在java gui中添加多个图像

html - 相对于动态调整大小和定位的前一个图像定位图像

graphics - 如何更改当前绘图窗口大小(在 R 中)

java - 在 JPanel 中实现图形

java - CXF 和多个 servlet 映射

Java linux打印问题

r - 绘制 R 地区粮农组织捕鱼区 map

java - 实现compareObjects()的正确方法是什么