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) {
Graphics g = img.getGraphics();
g.setColor(Color.BLACK);
g.fillRect(x,y,w,h);
return img;
}
But I am not able to color it. Am I doing it wrong?
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...
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();
}
}
}
}