登录界面设计之二:图片转换问题

  老人们常说,实践出真知,这句话本身应该就是从实践中总结出来的。


  刚简单的弄了一下界面,出现了一个问题,然后经过一番纠缠,解决了,现记录如下:

  • 问题的出现

  大家都知道,一般Form在窗体的左上角是一个图标,WinForm中,这个图标必须是ico格式的。可是,现在手里几乎没有ico格式的图标,而DevExpress中的图标,基本都是png格式的,所以,这里就涉及到一个转换问题。

  本想着去网上下载一个转换软件,后来想想,是不是可以自己整一个出来?

  其实嘛,所谓自己整,无非是自己去借鉴其他人的代码而已,但自己毕竟动手了,其中再加上一点点的思考的话,那么,效果就有了,正所谓师夷长技以制夷嘛!呵呵,扯远了又。

  • 摘抄的代码

这是从网上摘抄的代码,一些注释我修改了一下,通过这个方法的调用,就可以实现把png文件转换为ico文件了。

 1      /// <summary>
 2         ///  PNG文件转换成ICO文件
 3         /// </summary>
 4         /// <param name="filePth">png文件路径</param>
 5         /// <returns></returns>
 6         private void ConvertToIcon(string filePath)
 7         {
 8             Image image = Image.FromFile(filePath);
 9             // 方法1:直接使用
10             image.Save(@"D:\直接修改的.ico", ImageFormat.Icon);
11 
12             // 方法2:
13             using (MemoryStream msImg = new MemoryStream(), msIco = new MemoryStream())
14             {
15                 // 这里,相当于把原始的Png文件保存到了流中
16                 image.Save(msImg, ImageFormat.Png);
17 
18                 using (BinaryWriter bw = new BinaryWriter(msIco))
19                 {
20                    bw.Write((short)0);    // 0-1,保留
21                    bw.Write((short)1);    // 2-3,文件类型,1=图标,2=光标
22                    bw.Write((short)1);    // 4-5,图像数量
23                    bw.Write((byte)image.Width);     // 6,图标宽度
24                    bw.Write((byte)image.Height);    // 7,图标高度
25                    bw.Write((byte)0);    // 8,颜色数,0表示多余8未
26                    bw.Write((byte)0);    // 9,保留
27                    bw.Write((short)0);    // 10-11,调色板
28                    bw.Write((short)32);    // 12-13,位深
29                    bw.Write((int)msImg.Length);    // 14-17,位图数据大小
30                    bw.Write(22);    // 18-21,位图数据起始字节
31                    bw.Write(msImg.ToArray());
32                    bw.Flush();
33                    bw.Seek(0, SeekOrigin.Begin);
34 
35                     Icon newIcon = new Icon(msIco);
36                     string newFilePath = filePath.Replace("png", "ico");
37 
38                     FileStream fs = new FileStream(newFilePath,FileMode.Create,FileAccess.Write);
39 
40                     newIcon.Save(fs);
41                     fs.Close();
42                 }
43             }
44         }
  • 两种方法的差异:

  通过观察,差异主要在文件头部,使用第二种方法会比第一种方法多出来代码中所填写的那22个字节的数据,而且,第一种方法转换完的ico图标显示的不是太正常,但可以使用一些软件打开。

  小结:迷迷糊糊用了将近2个小时把这点代码写了写,改了改,当然这中间还设计了一个支持文件拖拽的界面,这些就不贴上了。成就感还是有一点的,因为自己遇到问题,知道自己去找找代码而不是找找软件了(当然这如果可以算进步的话)。

posted @ 2019-01-21 21:48  punisher_cn  阅读(354)  评论(0编辑  收藏  举报