如何从Java创建ICO文件

问题描述 投票:-1回答:1

如果您想用一种快速的方法从Java创建ico文件,答案是一些应该起作用的代码:

注意:使用ImageIO加载图像,如果需要,可以直接使用BufferedImage。

java programmatically-created programmatically ico
1个回答
0
投票
// Sizes to create
private static final int[] sizes = new int[] { 16, 32, 48, 256 };

public static void SaveAsIco(File image, File writeTo)
{
    if (!writeTo.exists())
    {
        try
        {
            writeTo.createNewFile();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    BufferedImage source;
    try
    {
        source = ImageIO.read(image);
    } catch (IOException e1)
    {
        e1.printStackTrace();
        return;
    }

    try (FileOutputStream w = new FileOutputStream(writeTo))
    {
        // Ico header
        w.write(new byte[] { 0, 0, 1, 0, 4, 0 });

        // The images as png in byte form
        byte[][] data = new byte[sizes.length][];

        // Converts to png byte[]
        for (int i = 0; i < data.length; i++)
        {
            // Creates transparent image
            BufferedImage resized = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
                    .getDefaultConfiguration().createCompatibleImage(sizes[i], sizes[i], Transparency.TRANSLUCENT);
            // Draws source over it
            resized.getGraphics().drawImage(source, 0, 0, sizes[i], sizes[i], null);
            // Stream to save data in
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // Writes as png
            ImageIO.write(resized, "png", baos);
            data[i] = baos.toByteArray();
        }

        // Header of ico + image entry headers in bytes
        int offset = 6 + sizes.length * 16;

        for (int i = 0; i < sizes.length; i++)
        {
            // ico size
            final byte dim = sizes[i] == 256 ? 0 : (byte) sizes[i];
            byte[] imageEntry = new byte[] { dim, dim, 0, 0, 1, 0, 32, 0 };
            // Image entry header
            w.write(imageEntry);

            // Data size, will be written after the data
            w.write((byte) data[i].length);
            w.write((byte) (data[i].length >> 8));
            w.write((byte) (data[i].length >> 16));
            w.write((byte) (data[i].length >> 24));

            // Offset to image data
            w.write((byte) (offset));
            w.write((byte) (offset >> 8));
            w.write((byte) (offset >> 16));
            w.write((byte) (offset >> 24));

            // Adds size of image to offset
            offset += data[i].length;
        }

        // Writes actual png data
        for (int i = 0; i < data.length; i++)
            w.write(data[i]);
    } catch (IOException e)
    {
        e.printStackTrace();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.