Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read OS X *.icns file with Java

I want to read *.icns files in OS X into a BufferedImage. Help

like image 382
Pepsi Avatar asked Mar 17 '26 21:03

Pepsi


2 Answers

Try this: http://code.google.com/p/appengine-awt/source/browse/trunk/apache-sanselan/src/main/java/org/apache/sanselan/formats/icns/IcnsDecoder.java?spec=svn8&r=8

Which is actually from: http://incubator.apache.org/sanselan/site/index.html

like image 56
LaC Avatar answered Mar 20 '26 12:03

LaC


You need to convert ICNS to another image type first, and after load this image you can delete it. This is how to convert PNG to ICNS, so you just need to do in the opposite way:

public static void Png(File png, File icns) throws IOException{
    ImageIcon image = new ImageIcon(ImageIO.read(png));
    ImageIconAs(image, icns);
}

public static void ImageIconAs(ImageIcon ii, File icns) throws IOException{IconAs((Icon)ii,icns);}

public static void IconAs(Icon icon, File icns) throws IOException{
        if (icon != null) {
                BufferedImage bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB );
                Graphics2D g = bi.createGraphics();
                icon.paintIcon(new Canvas(), g, 0, 0 );
                g.dispose();
                File outputfile = new File("temp000.png");
                ImageIO.write(bi, "png", outputfile);
                execTerminal(new String[]{ "sips", "-s", "format", "tiff", 
                        "temp000.png","--out", "temp000.tiff" });  
                File apaga2 = new File("temp000.png");
                apaga2.delete();
                execTerminal(new String[]{ "tiff2icns", "-noLarge", 
                        "temp000.tiff", icns.getAbsolutePath()});
                File apaga = new File("temp000.tiff");
                apaga.delete();
        }
    }

static void execTerminal(String[] cmd){
        int exitCode = 0;
        try {
            exitCode = Runtime.getRuntime().exec(cmd).waitFor();
        } 
        catch (InterruptedException e) {e.printStackTrace();}
        catch (IOException e) {
            if (exitCode != 0) System.out.println("ln signaled an error with exit code " + exitCode);
        }
    }

You just need to use this to call the action:

Png(png_file,icns_file);

like image 25
Appleverse Avatar answered Mar 20 '26 10:03

Appleverse



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!