Basti
Basti

Reputation: 1190

How to get the icon/image of any file in java?

i have a java.util.List filled with java.io.File and i wan't to list them in a gui. To display them i wan't to show their name which is accessable by the method getName() of java.io.File. And i want to display their icon/image with which they are displayed for example on the desktop. To build this i am using the newest javaversion (Java8/1.8). So far i found one way to do get the image of any file which looks like this:

Icon icon = FileSystemView.getFileSystemView().getSystemIcon(pFile);

The problem about that is, that the returned icon is in a very small resolution(16x16) and i d like to display it in a bigger size. 80x80 would be perfect but doesn't have to be exactly it. 64x64 or smth like that would be fine, too. So i managed to resize the icon and stretch it but streatching 16x16 to 80x80 is not cool as you can imagine. There are to less pixels to get a good result.
I also found this tutorial but the first method shown in this tutorial doesn't work with Java8: http://www.rgagnon.com/javadetails/java-0439.html The method i am using right now is copied from there.

So is there any way to get a bigger sized icon like the one which is shown on the desktop of a specific file?

Thanks
Baschdi

Upvotes: 2

Views: 2755

Answers (2)

MrMarnic
MrMarnic

Reputation: 43

I have created a library called JIconExtractReloaded which can extract all icons sizes not only 32x32. Here is the link https://github.com/MrMarnic/JIconExtractReloaded.

Just write:

BufferedImage image = JIconExtract.getIconForFile(128,128,"C:\\Windows\\explorer.exe");

And you have the icon.

Upvotes: 2

Basti
Basti

Reputation: 1190

private BufferedImage getBufferedImage(final File pFile)
        throws FileNotFoundException {
    Image icon = ShellFolder.getShellFolder(pFile).getIcon(true);
    BufferedImage im = new BufferedImage(icon.getWidth(null),
            icon.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = im.createGraphics();
    g.drawImage(icon, 0, 0, null);
    g.dispose();
    int width = im.getWidth();
    int height = im.getHeight();
    System.out.println(width);
    System.out.println(height);
    final int maxHeigh = 79;
    double scaleValue = 0;
    if (height > width)
        scaleValue = maxHeigh / height;
    else
        scaleValue = maxHeigh / width;
    final int scaledWidth = (int) (im.getWidth() * scaleValue);
    final int scaledHeigh = (int) (im.getHeight() * scaleValue);
    BufferedImage resized = new BufferedImage(scaledWidth, scaledHeigh,
            im.getType());
    g = resized.createGraphics();
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g.drawImage(im, 0, 0, scaledWidth, scaledHeigh, 0, 0, im.getWidth(),
            im.getHeight(), null);
    g.dispose();
    return resized;
}

I imported the jdk7 and used the older function with ShellFolder. Works fine, even when running on java8. Thanks for the help :)

Upvotes: 1

Related Questions