这一定是一个非常愚蠢的解决方案,但我是盲目的。
我有这段代码:
BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
bi.getGraphics().setColor(Color.red);
bi.getGraphics().fillRect(300, 350, 100, 50);
ImageIO.write(bi, "jpeg", new File("image.jpg"));
我得到了这个黑色的800x600矩形和一个白色矩形。这是为什么?
谢谢:)
答案 0 :(得分:13)
每次在BufferedImage上调用getGraphics()时,都会得到一个新的Graphics对象,因此将颜色设置为一个,不会在下一个上设置它。所以缓存图形对象。
BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.setColor(Color.red);
g.fillRect(300, 350, 100, 50);
ImageIO.write(bi, "jpeg", new File("/home/dave/image.jpg"));
答案 1 :(得分:2)
作为参考,这里有一个可以方便地修改图形上下文的例子。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @http://stackoverflow.com/questions/5843426 */
public class RedOrWhite extends JPanel {
private static final int W = 800;
private static final int H = 600;
public RedOrWhite() {
this.setLayout(new GridLayout());
this.setPreferredSize(new Dimension(W, H));
int w = W / 2;
int h = H / 2;
int r = w / 5;
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setColor(Color.gray);
g.fillRect(0, 0, w, h);
g.setColor(Color.blue);
g.fillRect(w / 2 - r, h / 2 - r / 2, 2 * r, r);
g.dispose();
this.add(new JLabel(new ImageIcon(bi), JLabel.CENTER));
}
private void display() {
JFrame f = new JFrame("RedOrWhite");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new RedOrWhite().display();
}
});
}
}