2011-08-27 31 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应用到基于其设置的源和绘图。

相关问题