登录界面设计之二:图片转换问题
老人们常说,实践出真知,这句话本身应该就是从实践中总结出来的。
刚简单的弄了一下界面,出现了一个问题,然后经过一番纠缠,解决了,现记录如下:
- 问题的出现
大家都知道,一般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个小时把这点代码写了写,改了改,当然这中间还设计了一个支持文件拖拽的界面,这些就不贴上了。成就感还是有一点的,因为自己遇到问题,知道自己去找找代码而不是找找软件了(当然这如果可以算进步的话)。