本帖最后由 king3258267 于 2009-12-07 18:24:06 编辑

解决方案 »

  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.   


    感谢你的回复,有点头绪了,不过由于我实在是经验不足,怎么把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.   


    哦,现在很多书都是说自定义一个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.   

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

  7.   


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

  8.   

    Swing都是覆盖paintComponet(Graphics g),