Java 使用swing创建图像托盘
我正在使用swing创建一个图像托盘。它所做的是找到文件夹或驱动器中的所有图像文件,然后将它们添加到实际上是JPanel的托盘中。守则如下:Java 使用swing创建图像托盘,java,image,performance,swing,Java,Image,Performance,Swing,我正在使用swing创建一个图像托盘。它所做的是找到文件夹或驱动器中的所有图像文件,然后将它们添加到实际上是JPanel的托盘中。守则如下: public void findAllPhotos(File f ) { File[] files = f.listFiles(); for (File file : files) { if(file.isFile()) { String path = file.getAbsolutePath();
public void findAllPhotos(File f ) {
File[] files = f.listFiles();
for (File file : files) {
if(file.isFile()) {
String path = file.getAbsolutePath();
for(String s : extensions) {
if(path.endsWith(s)) {
addImageToTray(file);
break;
}
}
}
else {
findAllPhotos(file);
}
}
}
void addImageToTray(File fname) {
try {
BufferedImage img = ImageIO.read(fname);
if(img == null) return;
double width = 0, height = 0;
if(iconView) {
width = Math.min(img.getWidth(), iconWidth);
height = Math.min(img.getHeight(), iconHeight);
}
else {
width = Math.min(img.getWidth(), tileWidth);
height = Math.min(img.getHeight(), tileHeight);
}
AffineTransform af = new AffineTransform(AffineTransform.getScaleInstance(width/img.getWidth(), (height/img.getHeight())));
img = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR).filter(img, null);
JLabel jl = new JLabel(new ImageIcon(img));
if(iconView) {
jl.setText(" " +fname.getName());
jl.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 1, 11));
}
addActionListner(jl, fname.getAbsolutePath());
jl.setBorder(new BevelBorder(BevelBorder.LOWERED));
tray.add(jl);
} catch (IOException ex) {
JOptionPane.showMessageDialog(null, "unknown problem, with tray creation!!!");
}
}
我的问题是,对于大型文件夹和扫描驱动器,速度很慢。
请建议提高速度的方法。ImageIO.read()
与图像读取器的本机实现(用c++)相比,它本身速度非常慢。但是,当您使用以下代码调整图像大小时:
AffineTransform af = new AffineTransform(AffineTransform.getScaleInstance(width/img.getWidth(), (height/img.getHeight())));
img = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR).filter(img, null);
速度慢,缩放质量很差。请阅读本文,了解缩放图像的各种技术及其性能问题。快速扩展和更好性能的快速解决方案是使用以下代码:
private static GraphicsConfiguration getGraphicsConfiguration() {
return GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
}
BufferedImage tmpImage = getGraphicsConfiguration().create(newWidth, newHeight, Transparency.TRANSLUCENT);
Graphics2D g2d = (Graphics2D)tmpImage.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, 0, 0, newWidth, newHeight, null);
tmpImage
现在是新的缩放图像。性能更好。纯java中有一个已知的库,它将以最佳的时间成本提供更高质量的缩放图像:
ImageIO.read()
与图像读取器的本机实现(用c++)相比,它本身速度非常慢。但是,当您使用以下代码调整图像大小时:
AffineTransform af = new AffineTransform(AffineTransform.getScaleInstance(width/img.getWidth(), (height/img.getHeight())));
img = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR).filter(img, null);
速度慢,缩放质量很差。请阅读本文,了解缩放图像的各种技术及其性能问题。快速扩展和更好性能的快速解决方案是使用以下代码:
private static GraphicsConfiguration getGraphicsConfiguration() {
return GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
}
BufferedImage tmpImage = getGraphicsConfiguration().create(newWidth, newHeight, Transparency.TRANSLUCENT);
Graphics2D g2d = (Graphics2D)tmpImage.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, 0, 0, newWidth, newHeight, null);
tmpImage
现在是新的缩放图像。性能更好。纯java中有一个已知的库,它将以最佳的时间成本提供更高质量的缩放图像:
你试过分析它吗?没有,我认为在分析之前可以进行一些高级操作。
jl.setFont(新java.awt.Font(“Microsoft JhengHei UI Light”,1,11))代码>将在OSX&*nix上中断。如果您打算只为Windows编写代码,请查看.Net<代码>图像读取(fname)代码>是一种阻塞方法。查看类的映像加载方法(异步),或者懒洋洋地加载它们(当它们进入视图区域时)。“我认为在分析之前可以进行一些高级优化。”当然,但@RomanC和我自己也知道,当有人去“优化”代码时,他们通常优化错误的部分。剖析器将准确地识别代码的哪一部分是瓶颈。我很确定它在addImageToTray(File fname)函数中。您是否尝试对其进行剖析?不,我认为在剖析之前可以进行一些高级优化。jl.setFont(新的java.awt.Font(“Microsoft JhengHei UI Light”,1,11))代码>将在OSX&*nix上中断。如果您打算只为Windows编写代码,请查看.Net<代码>图像读取(fname)代码>是一种阻塞方法。查看类的映像加载方法(异步),或者懒洋洋地加载它们(当它们进入视图区域时)。“我认为在分析之前可以进行一些高级优化。”当然,但@RomanC和我自己也知道,当有人去“优化”代码时,他们通常优化错误的部分。分析器将准确地识别代码的哪一部分是瓶颈。我非常确定它在AddImageToRay(File fname)函数中