我需要从图标(.ICO)文件中获取XOR Mask和AND Mask。
如果有人能建议我如何在Java中做到这一点,那就太棒了。如果没有,您是否知道有任何应用程序可以获取这两个掩码并允许您转储它们?
发布于 2011-10-04 23:22:28
这篇名为Enhance Java GUIs with Windows Icons的文章很好地解释了这种格式,并提供了一些源代码的链接。
发布于 2021-06-05 02:17:26
维基百科关于Windows图标图像文件格式https://en.m.wikipedia.org/wiki/ICO_(file_format)的文章非常直截了当。
有三个部分:标题、条目和图像数据。报头是6个字节。每个条目为16个字节。每个条目结构的偏移量8是用于对图像数据的偏移量的Java整数
32 bitDepth位图的图像数据没有AND掩码。如果它是24 bitDepth,那么它需要异或颜色掩模和1 bitDepth与掩模。
bytes[] openFile(String fname) throws Exception
{
java.io.InputStream file = new java.io.FileInputStream(fname);
bytes []bytes = new bytes[file.available()];
file.read(bytes);
file.close();
return bytes;
}
//assumes 24 bitDepth
bytes[] getXorMask(bytes []ico)
{
int i = 6 + 8;
i = bytes[i+0] | (bytes[i+1]<<1) | (bytes[i+2]<<2) | (bytes[i+3]<<3);
i += sizeof(BITMAPINFOHEADER); // WOW! NOT JAVA
int width = bytes[6] == 0 ? 256 : bytes[6];
int height = bytes[7] == 0 ? 256 : bytes[7];
int sz = width * height * 3; // very presumptious
byte []bytes = new byte[sz];
for(int e=0; e<sz; ) bytes[e++] = ico[i++];
return bytes;
}
bytes[] getAndMask(bytes []ico)
{
int i = 6 + 8;
i = bytes[i+0] | (bytes[i+1]<<1) | (bytes[i+2]<<2) | (bytes[i+3]<<3);
i += sizeof(BITMAPINFOHEADER); // WOW! NOT JAVA
int width = bytes[6] == 0 ? 256 : bytes[6];
int height = bytes[7] == 0 ? 256 : bytes[7];
int sz = width * height * 3; // very presumptious
byte []bytes = new byte[sz];
i += sz; // seek to monochrome mask
// only works if bounds is multiple of 4
sz = width/8 * height;
for(int e=0; e<sz; ) bytes[e++] = ico[i++];
return bytes;
}前面的示例总是获取第一个图像条目。另外,我认为这是一个简单的实现,但是Java对BITMAPINFOHEADER一无所知,而且这个结构是一个可变大小的结构。
编辑:
首先,要感谢雷蒙德·陈。他在MSDN上有一门关于图标(第1部分-第4部分)的课程。
进一步阅读,https://docs.microsoft.com/en-us/previous-versions/ms997538(v=msdn.10)?redirectedfrom=MSDN,显示BITMAPINFOHEADER结构应该是固定大小的。查看结构BITMAPINFOHEADER的win32定义。它的大小是40字节。
编辑: BITMAPINFOHEADER structure的第一个DWORD是结构的大小,以小端为单位。
https://stackoverflow.com/questions/7636814
复制相似问题