我想将图像绘制到已经存在的BufferedImage上,如下所示:
public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
Graphics g = a.getGraphics();
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(b);
}
但是,这会实例化两个Graphics对象g
和g2
。图形实例会占用大量内存,因此建议您在使用它们以减少RAM使用后将其丢弃,如下所示:
g.dispose();
一开始对我做这样的事情会很有意义:
public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
Graphics g = a.getGraphics();
Graphics2D g2 = (Graphics2D) g;
g.dispose();
g2.drawImage(b);
g2.dispose();
}
但是,如果演员阵容产生的对象具有与演出对象相同的参考值,那么这将不起作用。
所以,这是我的问题:演员阵容产生的对象是否与演出对象具有相同的参考值,以便
TypeA a = (TypeA) b;
等于
TypeA a = (TypeA) b.clone();
?
(请注意,Graphics对象不是Cloneable
,因此上面的内容不适用于Graphics对象)
答案 0 :(得分:3)
我认为你将对象引用与对象实例混淆。在上面的示例中,您只有一个Graphics对象的实例,并为其分配了两个引用。这并不意味着内存中存在2个相同的Graphics对象实例,因此您无需担心处置它。
这行代码基本上只是为同一个对象添加另一个对象引用。所以现在g和g2都指向内存中的同一个对象。
Graphics2D g2 = (Graphics2D) g
为了简洁起见,您可以像这样实现代码,而无需为同一个对象分配第二个引用:
public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
Graphics2D g2 = (Graphics2D) a.getGraphics();
g2.drawImage(b);
g2.dispose();
}
希望能够解决问题