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
感谢你的回复,有点头绪了,不过由于我实在是经验不足,怎么把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(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者
好久不做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回去
g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去
#6
上面的方法好像是在设置setTransform之后画的图才会经过scale处理,我原本是想使得原有的图形放大或缩小的。
呃。。即如果我原本在Jpanel上画了一些图(直线或矩形啊什么的),即用正常比例画的,然后点一个button,触发事情之后可以使得原Jpanel上的所有图形同时放大或缩小呢?
#7
试一试Graphics2D.transform方法
#8
继承JPanel再写一个方法~~~~
#9
??能否详细说一下?
#10
好的,我试试吧,好像在网上看到有人用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
感谢你的回复,有点头绪了,不过由于我实在是经验不足,怎么把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(鳄鱼书),里面很大章节是关于这方面的,作者就是犀牛书的作者
好久不做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回去
g.setTransform(AffineTransform.getScaleInstance(2,0.5)); // 记得,只设定一次,而不是事件触发,每次都调用
从此以后,你话的东西全经过scale处理了,如果想恢复原样,实现先保留g.getTransform(),然后再set回去
#6
上面的方法好像是在设置setTransform之后画的图才会经过scale处理,我原本是想使得原有的图形放大或缩小的。
呃。。即如果我原本在Jpanel上画了一些图(直线或矩形啊什么的),即用正常比例画的,然后点一个button,触发事情之后可以使得原Jpanel上的所有图形同时放大或缩小呢?
#7
试一试Graphics2D.transform方法
#8
继承JPanel再写一个方法~~~~
#9
??能否详细说一下?
#10
好的,我试试吧,好像在网上看到有人用scale方法解决了,还是要慢慢想一下。
#11
Swing都是覆盖paintComponet(Graphics g),