从图像列表中找到最佳拟合

时间:2015-02-20 22:55:42

标签: java image-manipulation best-fit image4j

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

0 个答案:

没有答案