Image4jというライブラリを使用してico ファイルをロードし、リストから画像の 1 つを選択し、(必要に応じて) 拡大縮小し、ImageIcon として JLabel に配置します。
ライブラリには、ico ファイルに含まれるすべての画像のリストでread(File icoFile)
ある を返すメソッドがあります。List<BufferedImage>
私ができるようにしたいのは、ラベルのサイズに最も近い画像をリストからすばやく選択することです。ラベルと 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 で画像を再スケーリングした経験はほとんどありません。サイズが最も近いものを見つける必要さえありますか? 元のサイズがはるかに大きい場合でも、品質をあまり落とさずに再スケーリングする方法はありますか?