2

我创建了一个简单地显示图片的 SWING 组件 JImageEditor。这个想法是在以后为组件添加更多功能。

我已经实现的一项功能是缩放。现在,这部分由 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 实例,这将导致更高的内存消耗,具体取决于图像大小。当然,不可能预测任何给定用户将使用该组件打开多大的图像。

如果我的工作在正确的轨道上,我正在寻找的是竖起大拇指,或者如果它的设计不好并且应该考虑其他一些解决方案,那么我正在寻找的是竖起大拇指。我感谢所有输入,并将奖励所有启发我的答案:-)

4

1 回答 1

3

我会说在您的paintComponent 中放置一个计时部分来测量需要多长时间。从你现在拥有的东西中得到你的基本衡量标准。然后用额外的 BufferedImage 实现优化的方法。比较测量值并选择较小的那个。我感觉你的直觉是正确的,每个绘画周期进行仿射变换很慢,并且通过为缩放图像和源创建双缓冲区会更快。虽然我找不到任何可以证实或否认这一点的东西,但它可能会受到硬件加速的影响。

如果您将该部分代码提取到 ZoomableBufferedImage 类中,您可以轻松打开或关闭优化/未优化版本。ZoomableBufferedImage 将保存对源图像的引用,并包含一个额外的缓冲图像,它可以保持缩放版本。当您放大/缩小 ZoomableBufferedImage 是否根据其设置绘制到缓冲区时,然后在它的绘制方法中它可以从缓冲区中绘制,也可以通过将 AffineTransform 应用于源并根据其设置进行绘制。

于 2011-08-27T15:53:26.770 回答