(java)求助Graphics2D or Graphics所绘矢量该怎么实现缩放?

时间:2021-12-04 21:38:23
在java的面板(Jpanel)中用Graphics2D画的图形,如矩形,直线等,该如何实现放大 或 缩小功能呢?本人很菜,希望各位前辈能给个例子什么的~~谢谢~~

11 个解决方案

#1


import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Test {

  public static void main(String[] args) throws Exception {
    // 原始的图像,自己draw的也可以
    BufferedImage original = ImageIO.read(new File("D:/test.jpg"));
    // 新的图像宽度放大,高度缩小
    BufferedImage image = new BufferedImage(original.getWidth() * 2, original
        .getHeight() / 2, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    // AffineTransform做效果的,这个是缩放,还有旋转等
    g2d.drawRenderedImage(original, AffineTransform.getScaleInstance(2, 0.5));
    ImageIO.write(image, "png", new File("D:/test2.png"));
  }
}

#2


引用 1 楼 shine333 的回复:
Java codeimport java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;publicclass Test {publicstaticvoid main(String[] args)throws Exception {// 原始的图像,自己draw的也可以    BufferedImage original= ImageIO.read(new File("D:/test.jpg"));// 新的图像宽度放大,高度缩小    BufferedImage image=new BufferedImage(original.getWidth()*2, original
        .getHeight()/2, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d= (Graphics2D) image.getGraphics();// AffineTransform做效果的,这个是缩放,还有旋转等    g2d.drawRenderedImage(original, AffineTransform.getScaleInstance(2,0.5));
    ImageIO.write(image,"png",new File("D:/test2.png"));
  }
}


感谢你的回复,有点头绪了,不过由于我实在是经验不足,怎么把Jpanel转换成BufferedImage?我现在做的课程设计是要求在Jpanel上用Graphics2D画图(如直线,*画笔,矩形等,这些我都实现了),现在最坏的情况是把整个Jpanel放大或缩小,并能实时显示?哎~~前辈能QQ上交流一下么?估计是小问题,用不了多久的。我的QQ:312073548

#3


偶不用QQ或任何聊天工具。
好久不做swing了,如果没记错的话,可以自定义一个JPanel,覆盖里面的paint方法,paint的参数就是该控件的Graphics,你可以手工转型为G2D.

以前我有一本O'Reilly的书,Java Examples in a Nutshell 3rd Edition(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者

#4


引用 3 楼 shine333 的回复:
偶不用QQ或任何聊天工具。
 好久不做swing了,如果没记错的话,可以自定义一个JPanel,覆盖里面的paint方法,paint的参数就是该控件的Graphics,你可以手工转型为G2D.

 以前我有一本O'Reilly的书,Java Examples in a Nutshell 3rd Edition(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者


哦,现在很多书都是说自定义一个JPanel,并覆盖里面的paint方法,不过我用的方法好像不用那么做。

 public void lineOperation(MouseEvent e)
 {
    Graphics2D g  = (Graphics2D)drawPanel.getGraphics();//相当于返回drawPanel环境的画笔
    g.setStroke(new BasicStroke(Float.parseFloat((String)jComboBoxStroke.getSelectedItem())));//设置画线的粗细
    g.setColor(mainColor);//设置画图色彩

//下面开始画直线
    /*
      In initial state setup default values
      for mouse coordinates
    */
    if (initialLine)
    {
       setGraphicalDefaults(e);
       g.setXORMode(xorColor);
       g.drawLine(Orx,Ory,mousex,mousey);
       initialLine=false;
    }

    /*
      Make sure that the mouse has actually
      moved from its previous position.
    */
    if (mouseHasMoved(e))
    {
       /*
         Delete previous line shadow
         by xor-ing the graphical object
       */
       g.setXORMode(xorColor);
       g.drawLine(Orx,Ory,mousex,mousey);

       /* Update new mouse coordinates */
       mousex = e.getX();
       mousey = e.getY();

       /* Draw line shadow */
       g.drawLine(Orx,Ory,mousex,mousey);
    }
//在Jpanel上画线结束
 }

我用的是这样的方法,请问前辈该怎么改啊?

#5


可以,只不过需要增加
g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去

#6


引用 5 楼 shine333 的回复:
可以,只不过需要增加
 g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
 从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去

上面的方法好像是在设置setTransform之后画的图才会经过scale处理,我原本是想使得原有的图形放大或缩小的。
呃。。即如果我原本在Jpanel上画了一些图(直线或矩形啊什么的),即用正常比例画的,然后点一个button,触发事情之后可以使得原Jpanel上的所有图形同时放大或缩小呢?

#7


试一试Graphics2D.transform方法

#8


继承JPanel再写一个方法~~~~

#9


引用 8 楼 aa644509120 的回复:
继承JPanel再写一个方法~~~~


??能否详细说一下?

#10


引用 7 楼 shine333 的回复:
试一试Graphics2D.transform方法


好的,我试试吧,好像在网上看到有人用scale方法解决了,还是要慢慢想一下。

#11


Swing都是覆盖paintComponet(Graphics g),

#1


import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Test {

  public static void main(String[] args) throws Exception {
    // 原始的图像,自己draw的也可以
    BufferedImage original = ImageIO.read(new File("D:/test.jpg"));
    // 新的图像宽度放大,高度缩小
    BufferedImage image = new BufferedImage(original.getWidth() * 2, original
        .getHeight() / 2, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    // AffineTransform做效果的,这个是缩放,还有旋转等
    g2d.drawRenderedImage(original, AffineTransform.getScaleInstance(2, 0.5));
    ImageIO.write(image, "png", new File("D:/test2.png"));
  }
}

#2


引用 1 楼 shine333 的回复:
Java codeimport java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;publicclass Test {publicstaticvoid main(String[] args)throws Exception {// 原始的图像,自己draw的也可以    BufferedImage original= ImageIO.read(new File("D:/test.jpg"));// 新的图像宽度放大,高度缩小    BufferedImage image=new BufferedImage(original.getWidth()*2, original
        .getHeight()/2, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d= (Graphics2D) image.getGraphics();// AffineTransform做效果的,这个是缩放,还有旋转等    g2d.drawRenderedImage(original, AffineTransform.getScaleInstance(2,0.5));
    ImageIO.write(image,"png",new File("D:/test2.png"));
  }
}


感谢你的回复,有点头绪了,不过由于我实在是经验不足,怎么把Jpanel转换成BufferedImage?我现在做的课程设计是要求在Jpanel上用Graphics2D画图(如直线,*画笔,矩形等,这些我都实现了),现在最坏的情况是把整个Jpanel放大或缩小,并能实时显示?哎~~前辈能QQ上交流一下么?估计是小问题,用不了多久的。我的QQ:312073548

#3


偶不用QQ或任何聊天工具。
好久不做swing了,如果没记错的话,可以自定义一个JPanel,覆盖里面的paint方法,paint的参数就是该控件的Graphics,你可以手工转型为G2D.

以前我有一本O'Reilly的书,Java Examples in a Nutshell 3rd Edition(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者

#4


引用 3 楼 shine333 的回复:
偶不用QQ或任何聊天工具。
 好久不做swing了,如果没记错的话,可以自定义一个JPanel,覆盖里面的paint方法,paint的参数就是该控件的Graphics,你可以手工转型为G2D.

 以前我有一本O'Reilly的书,Java Examples in a Nutshell 3rd Edition(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者


哦,现在很多书都是说自定义一个JPanel,并覆盖里面的paint方法,不过我用的方法好像不用那么做。

 public void lineOperation(MouseEvent e)
 {
    Graphics2D g  = (Graphics2D)drawPanel.getGraphics();//相当于返回drawPanel环境的画笔
    g.setStroke(new BasicStroke(Float.parseFloat((String)jComboBoxStroke.getSelectedItem())));//设置画线的粗细
    g.setColor(mainColor);//设置画图色彩

//下面开始画直线
    /*
      In initial state setup default values
      for mouse coordinates
    */
    if (initialLine)
    {
       setGraphicalDefaults(e);
       g.setXORMode(xorColor);
       g.drawLine(Orx,Ory,mousex,mousey);
       initialLine=false;
    }

    /*
      Make sure that the mouse has actually
      moved from its previous position.
    */
    if (mouseHasMoved(e))
    {
       /*
         Delete previous line shadow
         by xor-ing the graphical object
       */
       g.setXORMode(xorColor);
       g.drawLine(Orx,Ory,mousex,mousey);

       /* Update new mouse coordinates */
       mousex = e.getX();
       mousey = e.getY();

       /* Draw line shadow */
       g.drawLine(Orx,Ory,mousex,mousey);
    }
//在Jpanel上画线结束
 }

我用的是这样的方法,请问前辈该怎么改啊?

#5


可以,只不过需要增加
g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去

#6


引用 5 楼 shine333 的回复:
可以,只不过需要增加
 g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
 从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去

上面的方法好像是在设置setTransform之后画的图才会经过scale处理,我原本是想使得原有的图形放大或缩小的。
呃。。即如果我原本在Jpanel上画了一些图(直线或矩形啊什么的),即用正常比例画的,然后点一个button,触发事情之后可以使得原Jpanel上的所有图形同时放大或缩小呢?

#7


试一试Graphics2D.transform方法

#8


继承JPanel再写一个方法~~~~

#9


引用 8 楼 aa644509120 的回复:
继承JPanel再写一个方法~~~~


??能否详细说一下?

#10


引用 7 楼 shine333 的回复:
试一试Graphics2D.transform方法


好的,我试试吧,好像在网上看到有人用scale方法解决了,还是要慢慢想一下。

#11


Swing都是覆盖paintComponet(Graphics g),