请问Icon.Save() 方法保存ICON图标时, 图像严重失真.如何解决?

颜氓 2008-09-18 11:42:56
这个问题已经困扰我好多天了.
到处寻求解决方案未果,所以才找到了这里.
希望能够解决啊! 先谢谢各位了!



我用的方法如下:



private void SaveIcon(Icon icon)
{
FileStream fs = new FileStream("E:\\save.ico", FileMode.Create, FileAccess.Write);
//通过文件流保存
icon.Save(fs);
fs.Flush();
fs.Close();
fs.Dispose();
}



其中,图标是从DLL文件中或者EXE文件中提取出来的.

提取方法如下:



         [DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int ExtractIconEx(string path, int i, IntPtr[] big, IntPtr[] small, uint op);

private void GetIcons(string FilePath, ref List LargeIconList, ref List SmallIconList)
{
//判断并实例化图标列表
if (LargeIconList == null) LargeIconList = new List();
if (SmallIconList == null) SmallIconList = new List();

//清空列表
LargeIconList.Clear();
SmallIconList.Clear();

//获得图标总数
int IconsNum = ExtractIconEx(FilePath, -1, null, null, 0);

//大图标和小图标的"句柄"(指针)数组
IntPtr[] LargeIcons = new IntPtr[IconsNum];
IntPtr[] SmallIcons = new IntPtr[IconsNum];

//读取全部图标,并保存在句柄数组中
ExtractIconEx(FilePath, 0, LargeIcons, SmallIcons, (uint)IconsNum);

//转换成对应的图标数组
for (int i = 0; i < IconsNum; i++)
{
//大图标
LargeIconList.Add(Icon.FromHandle(LargeIcons[i]));
//小图标
SmallIconList.Add(Icon.FromHandle(SmallIcons[i]));
}
}
...全文
1007 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasperu 2011-02-04
  • 打赏
  • 举报
回复
也是啊,感觉也是,是色深的问题,,,
颜氓 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lhy011 的回复:]
没弄过
看了你的图,猜想因该是colordepth的问题。win2000中,ttplayer图标最小化后就是那种失真图标
[/Quote]

我总觉得是Icon图标结构没保存好的原因.
颜氓 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 further00 的回复:]
不会,帮顶!
我也遇到这样的问题,但我是想把图标保存在imagelist中的,后来把colordepth改成32位的就可以了!
也不知怎么搞的,save总是保存8位的!
[/Quote]
我下载了一个通过API和ICON结构来导出ICON图标的. 能实施成功.
但是代码是纯英文注释的, 而且大量指针和API调用, 基本看不懂.

你要是有兴趣的话,可以加我QQ我传给你看看.
further00 2008-09-19
  • 打赏
  • 举报
回复
不会,帮顶!
我也遇到这样的问题,但我是想把图标保存在imagelist中的,后来把colordepth改成32位的就可以了!
也不知怎么搞的,save总是保存8位的!
颜氓 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zswang 的回复:]
参考:
http://www.cnblogs.com/hoodlum1980/archive/2007/11/14/958629.html
[/Quote]
多谢! 这个我认真研究研究!
王集鹄 2008-09-19
  • 打赏
  • 举报
回复
参考:
http://www.cnblogs.com/hoodlum1980/archive/2007/11/14/958629.html
花落_ 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 atlasroben 的回复:]
标准ico文件是多层结构的
里面包含多个色深的不同图片用于显示在16*16 32*32 ...等等不同情况下,而且还有不同的色深所以你在生成的时候需要知道你是使用在那一种尺寸下,如果都要用到那么你就都要把不同大小的ico层的图片都添加上去,任务栏,缩略图,小图标,大图标,快捷这些他们有的调用的图片是不一样的,如果你的图片只有16*16那么他在现在到32*32大小的时候就会失真,而且这里面还设计到色深,色深和宽度的原理是一样的,系统总是会…
[/Quote]
S
颜氓 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 YanMang 的回复:]
引用 3 楼 lhy011 的回复:
没弄过
看了你的图,猜想因该是colordepth的问题。win2000中,ttplayer图标最小化后就是那种失真图标


我总觉得是Icon图标结构没保存好的原因.
[/Quote]
说的很有道理. 只是在C#操作的话, 应该怎么弄呢
shanying_0 2008-09-19
  • 打赏
  • 举报
回复
学习了~~~~~~~~
lhy011 2008-09-19
  • 打赏
  • 举报
回复
没弄过
看了你的图,猜想因该是colordepth的问题。win2000中,ttplayer图标最小化后就是那种失真图标
atlasroben 2008-09-19
  • 打赏
  • 举报
回复
标准ico文件是多层结构的
里面包含多个色深的不同图片用于显示在16*16 32*32 ...等等不同情况下,而且还有不同的色深所以你在生成的时候需要知道你是使用在那一种尺寸下,如果都要用到那么你就都要把不同大小的ico层的图片都添加上去,任务栏,缩略图,小图标,大图标,快捷这些他们有的调用的图片是不一样的,如果你的图片只有16*16那么他在现在到32*32大小的时候就会失真,而且这里面还设计到色深,色深和宽度的原理是一样的,系统总是会找与你需要显示的模式最匹配的ico层显示出来,否则就自动帮你修改就会导致你失真了哈,所以你的ico最好是个个层种类的图形都有,你在存放ico的时候同样也要注意这个问题,取出该对象的所有ico层并保存下来才会在不同模式下不失真

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧