开源是程序员的基本美德
首先封装一个转换类:IcoHelper.cs
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace CarsonHelper.Until
{
/// <summary>
///ico处理类
/// </summary>
public class IcoHelper
{
/// <summary>
///转换ico
/// </summary>
/// <param name="width">图标宽高</param>
/// <param name="path">原图片地址</param>
/// <returns>System.String.</returns>
public static string ConvertIco(int width, string path)
{
try
{
string savepath =
$"{path.Substring(0, path.LastIndexOf('\\'))}\\{DateTime.Now.Ticks}_{width}X{width}.ico";
Size size = new Size(width, width);
//获得原始图片文件
using (Bitmap bm = new Bitmap(path))
{
using (Bitmap iconBm = new Bitmap(bm, size))
{
SaveToIcon(iconBm, Rectangle.Empty, savepath);
}
}
return savepath;
}
catch
{
return "";
}
}
/// <summary>
/// 从pic创建Icon信息, 生成Icon的尺寸为rect
/// </summary>
/// <param name="pic">图片对象</param>
/// <param name="rect">图标尺寸</param>
/// <returns>IconInfo.</returns>
private static IconInfo CreatIconInfo(Image pic, Rectangle rect)
{
rect = new Rectangle(0, 0, pic.Width, pic.Height);
Bitmap iconBitmap = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(iconBitmap);
g.DrawImage(pic, rect, new Rectangle(0, 0, pic.Width, pic.Height), GraphicsUnit.Pixel);
g.Dispose();
MemoryStream memoryStream = new MemoryStream();
iconBitmap.Save(memoryStream, ImageFormat.Bmp);
IconInfo icon = new IconInfo();
icon.Width = (ushort)rect.Width;
icon.Height = (ushort)rect.Height;
memoryStream.Position = 14;
icon.ImageData = new byte[memoryStream.Length - memoryStream.Position];
memoryStream.Read(icon.ImageData, 0, icon.ImageData.Length);
byte[] height = BitConverter.GetBytes((uint)icon.Height * 2);
icon.ImageData[8] = height[0];
icon.ImageData[9] = height[1];
icon.ImageData[10] = height[2];
icon.ImageData[11] = height[3];
icon.ImageSize = (uint)icon.ImageData.Length;
icon.ImageOffset = 6 + (uint)(1 * 16);
return icon;
}
/// <summary>
/// 保存pic为Icon图像,尺寸rect,保存文件路径名称PathName
/// </summary>
/// <param name="pic">图像对象</param>
/// <param name="rect">图标尺寸</param>
/// <param name="pathName">保存地址</param>
private static void SaveToIcon(Image pic, Rectangle rect, string pathName)
{
IconInfo iconInfo = CreatIconInfo(pic, rect);
FileStream stream = new FileStream(pathName, FileMode.Create);
ushort Reserved = 0;
ushort Type = 1;
ushort Count = 1;
byte[] temp = BitConverter.GetBytes(Reserved);
stream.Write(temp, 0, temp.Length);
temp = BitConverter.GetBytes(Type);
stream.Write(temp, 0, temp.Length);
temp = BitConverter.GetBytes(Count);
stream.Write(temp, 0, temp.Length);
stream.WriteByte((byte)(iconInfo.Width < 256 ? iconInfo.Width : 0));
stream.WriteByte((byte)(iconInfo.Height < 256 ? iconInfo.Height : 0));
stream.WriteByte((byte)iconInfo.ColorNum);
stream.WriteByte((byte)iconInfo.Reserved);
temp = BitConverter.GetBytes(iconInfo.Planes);
stream.Write(temp, 0, temp.Length);
temp = BitConverter.GetBytes(iconInfo.PixelBit);
stream.Write(temp, 0, temp.Length);
temp = BitConverter.GetBytes(iconInfo.ImageSize);
stream.Write(temp, 0, temp.Length);
temp = BitConverter.GetBytes(iconInfo.ImageOffset);
stream.Write(temp, 0, temp.Length);
stream.Write(iconInfo.ImageData, 0, iconInfo.ImageData.Length);
stream.Close();
}
}
/// <summary>
/// Icon图像信息类
/// </summary>
class IconInfo
{
public ushort Width = 16; // 图像宽度
public ushort Height = 16; // 图像高度
public ushort ColorNum = 0; // 图像中的颜色数
public ushort Reserved = 0; // 保留字
public ushort Planes = 1; // 为目标设备说明位面数
public ushort PixelBit = 32; // 每个像素素所占位数
public uint ImageSize; // 图像字节大小
public uint ImageOffset; // 图形数据起点偏移位置
public byte[] ImageData; // 图形数据
}
}调用方式如下:
string savepath = IcoHelper.ConvertIco(128,"保存路径");//成功返回ico保存路径,不成功返回空
成品下载地址:https://www.lanzoux.com/i8rgz4f
川公网安备 51010702003150号
留下您的脚步
最近评论