如果你想要一个快速的方法来创建一个ico文件从Java,答案是一些代码应该工作:
注意:使用ImageIO加载图像,如果需要,可以直接使用BufferedImage。
// 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();
}
}