首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Icon获取"XOR Mask“和"AND mask”

从Icon获取"XOR Mask“和"AND mask”
EN

Stack Overflow用户
提问于 2011-10-03 23:03:09
回答 2查看 773关注 0票数 4

我需要从图标(.ICO)文件中获取XOR MaskAND Mask

如果有人能建议我如何在Java中做到这一点,那就太棒了。如果没有,您是否知道有任何应用程序可以获取这两个掩码并允许您转储它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-04 23:22:28

这篇名为Enhance Java GUIs with Windows Icons的文章很好地解释了这种格式,并提供了一些源代码的链接。

票数 2
EN

Stack Overflow用户

发布于 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与掩模。

代码语言:javascript
复制
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是结构的大小,以小端为单位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7636814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档