以前总是喜欢用在线的方法将图片转换ICO文件。要是没网就是没办法了。所以做了一个软件工具。将BMP,JPG,PNP,GIF.ICO转换为规定大小的ICO文件。
1.文件格式判断
不通过文件扩展名而是通过二进制文件头进行格式判断。
/// <summary>
/// 通过读取文件头,判断是否为图片格式,并输出至typename
/// </summary>
/// <param name="typename">图片格式</param>
/// <param name="filePath">文件路径</param>
/// <returns>是否为指定的几种图片格式</returns>
private bool IsPicture(out string typename, string filePath)
{
try
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fs);
string fileClass = "";
byte[] cb = new byte[6];
cb = reader.ReadBytes(6);
if (cb[0] == 0)
{
foreach (var bs in cb)
{
fileClass += bs.ToString();
}
}
else {
for (int i = 0; i < 2;i++ )
{
fileClass += cb[i].ToString();
}
}
reader.Close();
fs.Close();
if (
fileClass == FILEHEAD_BMP
|| fileClass == FILEHEAD_JPG
|| fileClass == FILEHEAD_PNG
|| fileClass == FILEHEAD_GIF
|| fileClass == FILEHEAD_ICO
)
{
typename = fileClass;
return true;
}
else
{
typename = "";
return false;
}
}
catch
{
typename = "";
return false;
}
}
2.转换Image为Icon
这个代码我也是从网上找的,也不知道原创是谁了,因为很多文章都有。
/// <summary>
/// 转换Image为Icon
/// </summary>
/// <param name="image">要转换为图标的Image对象</param>
public static Icon ConvertToIcon(Image image )
{
if (image == null)
{
return null;
}
using (MemoryStream msImg = new MemoryStream()
, msIco = new MemoryStream())
{
image.Save(msImg, ImageFormat.Png);
using (var bin = new BinaryWriter(msIco))
{
//写图标头部
bin.Write((short)0); //0-1保留
bin.Write((short)1); //2-3文件类型。1=图标, 2=光标
bin.Write((short)1); //4-5图像数量(图标可以包含多个图像)
bin.Write((byte)image.Width); //6图标宽度
bin.Write((byte)image.Height); //7图标高度
bin.Write((byte)0); //8颜色数(若像素位深>=8,填0。这是显然的,达到8bpp的颜色数最少是256,byte不够表示)
bin.Write((byte)0); //9保留。必须为0
bin.Write((short)0); //10-11调色板
bin.Write((short)32); //12-13位深
bin.Write((int)msImg.Length); //14-17位图数据大小
bin.Write(22); //18-21位图数据起始字节
//写图像数据
bin.Write(msImg.ToArray());
bin.Flush();
bin.Seek(0, SeekOrigin.Begin);
return new Icon(msIco);
}
}
}
3.界面
拖几个按钮,label,panel,设置主窗体允许拖拽文件,几个事件,等等。工具类经常要置顶功能所以加了置顶开关。界面如下:
设置需要输出的ICO大小,然后把一张图片拖进窗体或者通过按钮打开,就可以转换,保存为ICO了。
ps:有个问题,就是文件名太长的话,状态栏会不显示!而不是只显示一部分,真奇葩。
PS:加上源码打包下载
http://download.csdn.net/download/wangzibigan/10216891