2011-08-27 72 views
2

我創建了一個SWING組件JImageEditor,它只是顯示圖片。這個想法是在更進一步的道路上向組件添加更多功能。Swing:在圖像組件中實現縮放功能的最佳方式

我已經實現的一個功能是縮放。現在,這部分是在paintComponent()方法中處理的。然而,不知何故,我懷疑這可能是一個壞主意,因爲這意味着每次調用paintComponent()時,圖像都將從原始大小縮放到當前的「縮放大小」。該代碼的paintComponent雲如下:

@Override 
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(); 
    double imageWidth = scale * image.getWidth(); 
    double imageHeight = scale * image.getHeight(); 
    double x = (w - imageWidth)/2; 
    double y = (h - imageHeight)/2; 
    AffineTransform at = AffineTransform.getTranslateInstance(x, y); 
    at.scale(scale, scale); 
    g2.drawRenderedImage(image, at); 
} 

現在,我雖然作爲替代是保持BufferedImage的兩個實例,其中一個是原來的,一個是當前的「視圖」。這樣我就可以在調用setScale()方法時處理實際的縮放/縮放,而不是在paintComponent()中縮放。然而,缺點是我需要保留BufferedImage的兩個實例,這將導致更高的內存消耗,具體取決於圖像大小。當然,不可能預測任何給定用戶將使用該組件打開多大的圖像。

我正在尋找的是如果我在正確的軌道上與我的工作或拇指向下豎起大拇指如果這是不好的設計和其他解決方案應該考慮。我欣賞所有的輸入,並將獎勵所有啓發我的答案:-)

+0

+1模型視圖分離。 – trashgod

回答

3

我想說在你的paintComponent中放置一個計時部分來測量需要多長時間。從你現在擁有的東西中獲得基本的測量。然後用額外的BufferedImage實現優化方法。比較測量結果並選擇較小的測量結果。我有一種感覺,你的直覺是正確的,即在每個繪畫循環中進行仿射變換是緩慢的,並且爲縮放圖像創建雙緩衝區,並且源將更快。儘管我找不到證實或否認此事的任何事情,並且可能會受到硬件加速的影響。

如果您將該代碼段提取到ZoomableBufferedImage類中,您可以輕鬆打開或關閉優化/未優化版本。 ZoomableBufferedImage將持有對源圖像的引用,幷包含一個額外的緩衝圖像,它可以保持縮放版本。放大/縮小時,ZoomableBufferedImage根據其設置繪製或不繪製緩衝區,然後在繪製方法中它可以從緩衝區中繪製,也可以將AffineTransform應用到基於其設置的源和繪圖。

相關問題