我创建了一个简单地显示图片的 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 实例,这将导致更高的内存消耗,具体取决于图像大小。当然,不可能预测任何给定用户将使用该组件打开多大的图像。
如果我的工作在正确的轨道上,我正在寻找的是竖起大拇指,或者如果它的设计不好并且应该考虑其他一些解决方案,那么我正在寻找的是竖起大拇指。我感谢所有输入,并将奖励所有启发我的答案:-)