【问题标题】:Graphics2D, drawImage() -method, Scala SwingGraphics2D、drawImage() 方法、Scala Swing
【发布时间】:2015-06-09 20:38:06
【问题描述】:

我通过覆盖 paintComponent 方法在面板上绘画。

class Canvas extends Panel ...
...
override def paintComponent(g: Graphics2D) {
    super.paintComponent(g)
    for (cmd <- commands.get) cmd.execute(g, this)
}

好的。其中一个命令就是这个。

case class TestCommand() {
  def execute(g: java.awt.Graphics2D, c: Canvas) = {
    val img = new BufferedImage(c.width, c.height, BufferedImage.TYPE_INT_RGB) 
    g.drawImage(img, null, 0, 0)
}

我想要做的是从 Graphics2D 对象创建一个 BufferedImage,这样我就可以读取位置 x、y 的某个像素的值。

但是,当执行此命令时,我注意到 drawImage 方法导致我的面板完全变黑,擦除了到目前为止我在其上绘制的所有内容。我希望该命令简单地为我在面板上绘制的内容创建一个 BufferedImage,而不是以某种方式影响 Graphics2D 对象本身。我在这里做错了什么?

【问题讨论】:

  • “我希望该命令简单地为我在面板上绘制的内容创建一个 BufferedImage” 我发现在图像,然后简单地将图像绘制到组件(或者可能只是在标签中显示图像)。
  • "创建一个我在面板上绘制的 BufferedImage" 听起来您想将面板绘制到图像上,但现在您正在绘制 (空白)图像到面板。我也同意安德鲁的评论。
  • 感谢 cmets。你是对的,我正在将空白图像绘制到面板上。我不明白为什么 drawImage 方法正在这样做:“渲染一个用 BufferedImageOp 过滤的 BufferedImage。应用的渲染属性包括 Clip、Transform 和 Composite 属性。” -Oracle 文档。我不明白安德鲁斯的建议,你能给我举个例子吗?
  • 提示:添加@Radiodef(或重要的@)以通知此人有新评论。 “你能给我举个例子吗?”看到这个2D animation in a buffered image,这个animated stroked border和这个animation of dots and lines..从BufferedImage得到一个Graphics2D对象很简单打电话给createGraphics()

标签: swing scala graphics2d drawimage


【解决方案1】:

Graphics2D 连接到某个画布或图像。你可能会把它想象成刷子或钢笔。在这种情况下,您拥有的图形对象与您的面板相关联。调用drawImage 将图像绘制到面板上。

如果你想在图像上绘制面板,你需要一个Graphics for the BufferedImage

Graphics2D ig = img.createGraphics();

然后您需要将面板绘制到图形上。 java.awt.Component 为这类事情提供了许多方便的方法,例如printAll

c.printAll(ig);
ig.dispose(); // don't forget to dispose Graphics you've created

(对不起,我真的不知道 Scala 语法,如果它不同的话。)

不要太自以为是,也许有更好的方法来处理你正在做的事情。例如。如果您正在对面板进行绘画,如 cmets 中所述,通常最好先在图像上绘画,然后将图像绘画到面板。然后你总是有图像。

【讨论】:

  • 感谢@Radiodef。这一切终于说得通了。我得到了“把它想象成刷子或钢笔”的部分,但我不知道它连接到某个画布或图像。
猜你喜欢
  • 2018-04-11
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多