簡體   English   中英

繪制和縮放圖像的良好做法?

[英]Good practice for drawing and zooming image?

我有一個帶有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();
}

一定有比我所做的更好的練習。

我可以只繪制滾動窗格的區域,但是不能使用滾動條,然后必須使用帶有向上,向右,向左,向下箭頭的按鈕來滾動繪圖。 有人可以給我提示嗎?

但是我不能使用滾動條

當組件的首選大小大於滾動窗格的大小時,滾動條將起作用。 如果要在paintComponent()方法中縮放圖像,則還需要重寫getPreferredSize()方法,以返回考慮了縮放因子的圖像的適當大小。

因此,在您的情況下,首選大小將是圖像的大小。

如果要放大,我假設您不是要制作“更大的像素”,而是要以更大的比例繪制相同的圖形。 在那種情況下,您根本不應該使用BufferedImage ;相反,您應該繪制到適當縮放的JPanel或類似對象。 您隨時可以隨時對要渲染的內容進行快照; 但是不需要渲染到BufferedImage是浪費的(時間和內存)。

有關詳細信息,請參見此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM