请问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]));
}
}
...全文
1249 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层并保存下来才会在不同模式下不失真
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

111,132

社区成员

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

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

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