[英]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.