我有一个图像,在此上我画了一些线。当我在此面板上使用缩放时,只有图像会更改其大小(如果我进入图像的大尺寸,在我的情况下,宽度= 5550,高度= 7800,该行消失)。
如何使用缩放图像和绘制线条?
这是我的代码:
public class Mp extends JFrame implements ActionListener{
public Mp(Prev data){
this.data=data;
ImagePanel panel = new ImagePanel(data);
ImageZoom zoom = new ImageZoom(panel);
JFrame f = new JFrame();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(zoom.getUIPanel(), "North");
f.getContentPane().add(new JScrollPane(panel));
f.setSize(1300,750);
f.setVisible(true);
}
}
Image Panel:
class ImagePanel extends JPanel
{
Prev data;
private static final long serialVersionUID = 1L;
double scale;
public ImagePanel(Prev data)
{
this.data=data;
scale = 1.0;
setBackground(Color.black);
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
int w = getWidth();
int h = getHeight();
int imageWidth = data.image.getWidth();
int imageHeight = data.image.getHeight();
double x = (w - scale * imageWidth)/2;
double y = (h - scale * imageHeight)/2;
AffineTransform at = AffineTransform.getTranslateInstance(x,y);
at.scale(scale, scale);
g2.drawRenderedImage(data.image, at);
draw(g2);
}
public void draw(Graphics2D g) {
int val1=127, val2= 65;
for(int i=1; i<20; i++) {
g.setStroke(new BasicStroke(5));
g.setColor(Color.red);
g.drawLine(val1, val2, val1+10, val2+20);
val1+=10;
val2+=20;
}
}
public Dimension getPreferredSize()
{
int w = (int)(scale * data.image.getWidth());
int h = (int)(scale * data.image.getHeight());
return new Dimension(w, h);
}
public void setScale(double s)
{
scale = s;
revalidate();
repaint();
}
}
和缩放等级:
class ImageZoom
{
ImagePanel imagePanel;
public ImageZoom(ImagePanel ip)
{
imagePanel = ip;
}
public JPanel getUIPanel()
{
SpinnerNumberModel model = new SpinnerNumberModel(1.0, 0.1, 1.4, .01);
final JSpinner spinner = new JSpinner(model);
spinner.setPreferredSize(new Dimension(45, spinner.getPreferredSize().height));
spinner.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
float scale = ((Double)spinner.getValue()).floatValue();
imagePanel.setScale(scale);
}
});
JPanel panel = new JPanel();
panel.add(new JLabel("scale"));
panel.add(spinner);
return panel;
}
}
public void draw(Graphics2D g) {
int val1=127, val2= 65;
for(int i=1; i<20; i++) {
g.setStroke(new BasicStroke(5));
g.setColor(Color.red);
g.drawLine(val1, val2, val1+10, val2+20);
val1+=10;
val2+=20;
}
}
我想你的问题是,画线的代码假定是正常比例。那就是不管比例因子是多少,您总是将线值增加相同的数量。
我建议一种更好的方法是: