Coloring an area of BufferedImage

后端 未结 1 1257
闹比i
闹比i 2021-01-25 23:39

I want to color a sub area of a BufferedImage I have. I am presently doing:

public BufferedImage paintSubImage(BufferedImage img, int x, int y, int w, int h) {
          


        
相关标签:
1条回答
  • 2021-01-26 00:08

    Given the fact that there is little or no context to go on, it's difficult to know exactly what's wrong.

    General rule of thumb though, if you create/open it, you should dispose/close it...

    Splat

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class ColorMe {
    
        public static void main(String[] args) {
            new ColorMe();
        }
    
        public ColorMe() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private BufferedImage img;
    
            public TestPane() {
                try {
                    img = ImageIO.read(new File("/path/to/image..."));
    
                    addMouseListener(new MouseAdapter() {
    
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            Point p = e.getPoint();
                            Rectangle bounds = getPictureBounds();
                            if (bounds.contains(p)) {
    
                                int x = p.x - bounds.x;
                                int y = p.y - bounds.y;
    
                                splat(img, x, y);
                                repaint();
    
                            }
                        }
    
                    });
    
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            protected void splat(BufferedImage img, int x, int y) {
                Graphics2D g2d = img.createGraphics();
                g2d.setColor(Color.RED);
                g2d.fillOval(x - 10, y - 10, 20, 20);
                g2d.dispose();
            }
    
            protected Rectangle getPictureBounds() {
    
                Rectangle bounds = new Rectangle();
    
                if (img != null) {
    
                    bounds.x = (getWidth() - img.getWidth()) / 2;
                    bounds.y = (getHeight() - img.getHeight()) / 2;
                    bounds.width = img.getWidth();
                    bounds.height = img.getHeight();
    
                }
    
                return bounds;
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight());
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img != null) {
                    Graphics2D g2d = (Graphics2D) g.create();
                    Rectangle bounds = getPictureBounds();
                    g2d.drawImage(img, bounds.x, bounds.y, this);
                    g2d.dispose();
                }
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题