着色BufferedImage的区域

我想为我拥有的BufferedImage的子区域着色。 我现在在做:

public BufferedImage paintSubImage(BufferedImage img, int x, int y, int w, int h) { Graphics g = img.getGraphics(); g.setColor(Color.BLACK); g.fillRect(x,y,w,h); return img; } 

但我无法给它着色。 我做错了吗?

鉴于很少或根本没有上下文的事实,很难确切地知道什么是错的。

一般的经验法则,如果你创建/打开它,你应该处置/关闭它……

啪

 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 = px - bounds.x; int y = py - 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(); } } } }