diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index d03a2cb6..36d9d40a 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; @@ -46,23 +47,25 @@ namespace v2rayN.Handler //color = ColorTranslator.FromHtml(new string[] { "#CC0066", "#CC6600", "#99CC99", "#666699" }[index - 1]); } - var width = 128; - var height = 128; - + //var width = 128; + //var height = 128; + var width = 16; + var height = 16; + MemoryStream stream = new MemoryStream(); var bitmap = new Bitmap(width, height); var graphics = Graphics.FromImage(bitmap); var drawBrush = new SolidBrush(color); graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); var zoom = 16; - graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); - - Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); - + graphics.DrawImage(new Bitmap(Properties.Resources.notify, 16, 16), 0, 0); + bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); + //Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); + Icon createdIcon = PngIconConverter.IconFromImage(Image.FromStream(stream)); drawBrush.Dispose(); graphics.Dispose(); bitmap.Dispose(); - + stream.Dispose(); return createdIcon; } catch (Exception ex) @@ -150,6 +153,6 @@ namespace v2rayN.Handler } } - + } } diff --git a/v2rayN/v2rayN/Handler/PngIconConverter.cs b/v2rayN/v2rayN/Handler/PngIconConverter.cs new file mode 100644 index 00000000..26d857dc --- /dev/null +++ b/v2rayN/v2rayN/Handler/PngIconConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace v2rayN.Handler +{ + public class PngIconConverter + { + /// + /// https://stackoverflow.com/questions/21387391/how-to-convert-an-image-to-an-icon-without-losing-transparency + /// 在不损失alpha的情况下,将png 转为ico + /// 此方法可能有局限性,但是此处适用 + /// + /// + /// + public static Icon IconFromImage(Image img) + { + var ms = new System.IO.MemoryStream(); + var bw = new System.IO.BinaryWriter(ms); + // Header + bw.Write((short)0); // 0 : reserved + bw.Write((short)1); // 2 : 1=ico, 2=cur + bw.Write((short)1); // 4 : number of images + // Image directory + var w = img.Width; + if (w >= 256) w = 0; + bw.Write((byte)w); // 0 : width of image + var h = img.Height; + if (h >= 256) h = 0; + bw.Write((byte)h); // 1 : height of image + bw.Write((byte)0); // 2 : number of colors in palette + bw.Write((byte)0); // 3 : reserved + bw.Write((short)0); // 4 : number of color planes + bw.Write((short)0); // 6 : bits per pixel + var sizeHere = ms.Position; + bw.Write((int)0); // 8 : image size + var start = (int)ms.Position + 4; + bw.Write(start); // 12: offset of image data + // Image data + img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + var imageSize = (int)ms.Position - start; + ms.Seek(sizeHere, System.IO.SeekOrigin.Begin); + bw.Write(imageSize); + ms.Seek(0, System.IO.SeekOrigin.Begin); + + // And load it + return new Icon(ms); + } + } +} diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 302c50e0..aa88adab 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -181,6 +181,7 @@ SubSettingControl.cs +