【问题标题】:How to resize drawing area dynamically via Java?如何通过Java动态调整绘图区域的大小?
【发布时间】:2017-01-11 01:39:10
【问题描述】:

我正在尝试调整我的 BufferedImage(我的绘图区域)的大小,而不会丢失图像上绘制的图形并在调整大小后恢复绘制。(就像在 Paint .NET)我正在使用 JSplitPane 从边缘执行此操作并且它正在发生,但是当我想继续绘制时,光标(笔)距离绘制的图形(形状)大约 3 厘米,因为数字与图像一起成长。当我删除整个图片时,它会变得更好。

我查看了 Google 和 StackoverFlow 中的答案,但它对我不起作用。我该如何解决这个问题?

到目前为止我尝试过这样的:

类用户界面

jSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, (PropertyChangeEvent evt) -> { double imageHeight = jSplitPane.getDividerLocation(); double imageWidth = imageHeight * 1.6; top.setDividerLocation((int) imageWidth); drawGround.changeImageSizeDynmcally((int) imageWidth, (int) imageHeight); drawGround.repaint(); });

类 DrawGround

     BufferedImage masterImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
    //image is master image drawing at first time.

    public void changeImageSizeDynmcally(int w, int h) {
      AREA_WIDTH = w;
      AREA_HEIGHT = h;
      repaint();

      BufferedImage scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2D = scaledImage.createGraphics();
      g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      g2D.drawImage(masterImage, 0, 0, null);
      g2D.dispose();
}

在这个方法之后我有

     `@Override
 protected void paintComponent(Graphics g) {
     super.paintComponent(g);
        if (masterImage != null) {
            g2D = (Graphics2D) masterImage.getGraphics();
            g2D.setComposite(AlphaComposite.Src); 
            bla,bla,bla`

【问题讨论】:

  • 新建一个你想要大小的BufferedImage,将原来的BufferedImage 绘制到它上面(即Graphics#drawImage),分配新的BufferedImage 指向旧的...
  • 你永远不会将scaledImage分配给任何东西,所以masterImage(现在是旧的)仍然被使用
  • @MadProgrammer 谢谢你的回答,你是对的,现在我会试着通知你。
  • @MadProgrammer 用新的缩放图像更改主图像我需要创建返回 BufferedImage 的新方法。因为在我的方法中它是直接绘图。
  • 为什么不在方法中将scaledImage 分配给masterImage(并触发重绘)...masterImage = scaledImage;

标签: java graphics bufferedimage


【解决方案1】:

我通过创建新方法来设置图像解决了这个问题:

public void changeImageSizeDynmcally(int x, int y) {

    AREA_WIDTH = x;
    AREA_HEIGHT = y;
    repaint();

    scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2D = scaledImage.createGraphics();
    g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2D.drawImage(image,0,0, null);

    g2D.dispose();
    setImage(scaledImage); //this is a new method!
}`

新方法是:

public void setImage(BufferedImage img) { if (img != null) { g2D = (Graphics2D) img.getGraphics(); g2D.setComposite(AlphaComposite.Src); g2D.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); masterImage = img; repaint(); } } 就像将新图像分配给旧图像一样。

【讨论】:

  • g2D.drawImage(image,0,0, null),“图像”在哪里定义???你在发布之前不测试你的代码吗???这是一个不赞成的答案,但我不习惯反对。我更喜欢展示人们的错误!
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-08-20
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多