我正在使用一个名为Image4j的库来加载一个 ico 文件,从列表中选择一个图像,对其进行缩放(如果需要)并将其作为 ImageIcon 放入 JLabel 中。
该库有一个方法read(File icoFile)
,它返回List<BufferedImage>
ico 文件中包含的所有图像的列表。
我想要做的是从列表中快速选择最适合标签大小的图像。标签和 ico 图像都是方形的。
我想出了最幼稚的方法,但我怀疑有更快的方法。我会接受这个,但我的程序会经常执行这个例程,所以我希望这部分尽可能高效。
public class IconUtil() {
private final List<BufferedImage> list;
public IconUtil(List<BufferedImage> list) {
this.list = list;
}
public BufferedImage getBestFit(int sizeToFit) {
int indexOfBestFit = 0; // assume it's the first image
int bestMargin = Math.abs(list.get(0).getWidth() - sizeToFit);
int margin;
for(int i = 1; i < list.size(); i++) {
margin = Math.abs(list.get(i).getWidth() - sizeToFit);
if(margin < bestMargin) {
bestMargin = margin;
indexOfBestFit = i;
}
}
return list[indexOfBestFit];
}
}
按宽度比较图像的选择是任意的,因为它们都是正方形的。
此外,由于选择最佳拟合的主要原因是尝试保持图像的质量,这种方法是否应该丢弃任何小于目标尺寸的图像?如果是这样,那将如何改变算法?
我在 Java 中重新缩放图像的经验很少。甚至有必要找到尺寸最接近的匹配吗?也许即使原始文件更大,也有办法在不损失太多质量的情况下重新缩放?