using DevExpress.Utils; using DevExpress.Utils.Svg; using DevExpress.XtraMap.Native; using System; using System.Collections.Generic; using System.Data.SqlTypes; using System.Drawing; using System.IO; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace DxHelper { public static class SvgHelper { static readonly Dictionary cache = new Dictionary(); public static Image ToImage(this SvgImage svg,int w,int h) { var img = svg.Render(new Size(w, h), null, DefaultBoolean.False, DefaultBoolean.False); return img; } /// /// 判断color是否为HtmlColor(HtmlColor格式如#A1B2C3) /// /// /// public static bool IsHtmlColor(string color) { if (!color.StartsWith("#")) return false; if (color.Length != 7) return false; string r = color.Substring(1, 2); string g = color.Substring(3, 2); string b = color.Substring(5, 2); bool r1 = byte.TryParse(r, System.Globalization.NumberStyles.HexNumber, null, out _); bool r2 = byte.TryParse(g, System.Globalization.NumberStyles.HexNumber, null, out _); bool r3 = byte.TryParse(b, System.Globalization.NumberStyles.HexNumber, null, out _); return r1 & r2 & r3; } /// /// 将SvgImage转换为Image对象 /// /// /// /// /// public static Image SvgToImage(SvgImage svg, int width, int height) { var img = svg.Render(new Size(width, height), null, DefaultBoolean.False, DefaultBoolean.False); return img; } /// /// 将文件转换为SvgImage对象 /// /// /// /// /// public static SvgImage LoadFromFile(string svgFile) { return SvgLoader.LoadFromFile(svgFile); } /// /// 创建一个Svg圆.该圆的圆心在ViewBox的中心 /// /// 用于生成颜色的一个key,相同的key具有相同的颜色,当colorKey为html颜色时则使用此颜色(如#A1B2FF) /// html颜色,默认每次都使用一个随机颜色,格式如#FF2F3C /// 透明度,默认不透明 /// 视口宽度,默认32px /// 视口高度,默认32px /// 半径,默认16px /// 圆心的X轴偏移量,负向左偏移,正向右偏移,默认为0处于视口中心 /// public static SvgImage CreateCycle(string colorKey, double opacity = 1, int viewBoxWidth = 32, int viewBoxHeight = 32, int radius = 16, double offsetX = 0) { if (colorKey == null) colorKey = ""; if (cache.ContainsKey(colorKey)) return cache[colorKey]; SvgImage svg = new SvgImage(); SvgRoot root = SvgRoot.Create(new SvgElementProperties(), viewBox: new SvgViewBox(0, 0, viewBoxWidth, viewBoxHeight)); svg.Elements.Add(root); string colorStr; if (IsHtmlColor(colorKey)) colorStr = colorKey; else colorStr = ColorHelper.GetHtmlColor(colorKey); SvgElementProperties props = new SvgElementProperties { Fill = colorStr, Opacity = opacity//透明度 }; SvgCircle circle = SvgCircle.Create(props, viewBoxWidth / 2 + offsetX, viewBoxHeight / 2, radius); root.Elements.Add(circle); //SvgImage未公开Width和Height属性的公共写入,需要通过以下方式可对width和Size赋值 MemoryStream ms = new MemoryStream(); svg.Save(ms); svg = ms.ToArray(); cache.Add(colorKey, svg); ms.Dispose(); return svg; } public static SvgImage CreateClose(string colorStr = "#D11C1C", double opacity = 1) { if (string.IsNullOrWhiteSpace(colorStr)) colorStr = $"#D11C1C"; string xml = $"\r\n\r\n\r\n\r\n"; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateClear() { string xml = $"\r\n"; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateDistanceLine() { string xml = $"" + "" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateMarkDot() { string xml = $"" + "\r\n" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateGeoDot(string color = "#D11C1C") { string xml = $"" + $"" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } /// /// 五角星 /// /// /// /// /// public static SvgImage CreatePentagram(string color = "#1177D7") { string xml = $"" + $"" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateSat() { string xml = $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + $"" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } #region exportImg public static SvgImage CreateExportImg() { string xml = $"" + "\r\n\r\n\r\n\r\n\r\n\t\r\n" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateExportXlsx() { string xml = $"" + "\r\n\r\n\r\n\r\n\r\n\t\r\n" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } public static SvgImage CreateExportCsv() { string xml = $"" + "\r\n\r\n\r\n" + ""; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); var svg = SvgLoader.LoadFromStream(ms); ms.Dispose(); return svg; } #endregion } }