画线缩放

问题描述 投票:0回答:1

我有一个图像,在此上我画了一些线。当我在此面板上使用缩放时,只有图像会更改其大小(如果我进入图像的大尺寸,在我的情况下,宽度= 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;
   }
}
java swing zoom scale panel
1个回答
0
投票
 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;
    }
}

我想你的问题是,画线的代码假定是正常比例。那就是不管比例因子是多少,您总是将线值增加相同的数量。

我建议一种更好的方法是:

  1. 创建一个BufferedImage
  2. 将原始图像绘制到BufferedImage上
  3. 将线绘制到BufferedImage上
  4. 现在在paintComponent()方法中,您只需缩放BufferedImage。无需任何代码即可再次绘制线条。
© www.soinside.com 2019 - 2024. All rights reserved.