我正在使用名为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重新缩放图像的经验。甚至有必要找到最接近的尺寸匹配?也许有很多方法可以在不损失太多质量的情况下进行重新缩放,即使原件要大得多?