绘制和缩放图像的良好做法?

时间:2013-12-13 20:37:39

标签: java image swing jscrollpane paintcomponent

我有一个带有JPanel的JScrollPane,我可以通过鼠标和代码绘制。 我需要有可能放大我的绘图中的细节。 但很快我得到了一个outOfMemoryError。我想因为我在缩放时使绘图很大。 这是我的代码:

    private BufferedImage _bufferedImage;
private int _panelWidth = 2000, _panelHeight = 1500;

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(_bufferedImage != null){
        g.drawImage(_bufferedImage, 0, 0, this);
    }
}

public void draw(float zoomFactor){
    try {
        int width = (int)(_panelWidth * zoomFactor);
        int height = (int)(_panelHeight * zoomFactor);
        _bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = _bufferedImage.createGraphics();
        g2.setBackground(Color.WHITE);
        g2.setPaint(Color.BLACK);
        g2.scale(zoomFactor, zoomFactor);
        drawHouse(g2); ...
        g2.dispose();
    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    repaint();
}

我必须做更好的练习。

我可以绘制滚动窗格的区域,但是我不能使用滚动条, 然后我必须使用带有向上,向右,向左,向下箭头的按钮在我的绘图中滚动。 谁可以给我一个提示?

2 个答案:

答案 0 :(得分:2)

  

但我不能使用滚动条

当组件的首选大小大于滚动窗格的大小时,滚动条会起作用。如果要在paintComponent()方法中缩放图像,则还需要覆盖getPreferredSize()方法以返回考虑缩放系数的图像的适当大小。

因此,在您的情况下,首选尺寸将是图像的大小。

答案 1 :(得分:2)

如果你想放大,我假设你不是想制作“更大的像素”,而是以更高的比例绘制相同的数字。在这种情况下,你根本不应该使用BufferedImage - 相反,你应该绘制一个适当缩放的JPanel或类似的。无论何时需要,您都可以随时拍摄任何渲染的快照;但是在没有必要的情况下渲染到BufferedImage是浪费(时间和记忆)。

有关详细信息,请参阅this answer