namespace Yw.WinFrmUI.HydroL2d { /// /// 图片拓展 /// internal static class ImageExtension { /// /// 获取索引像素格式数组 /// public static PixelFormat[] IndexedPixelFormats { get { return new PixelFormat[] { PixelFormat.Undefined, PixelFormat.DontCare, PixelFormat.Format16bppArgb1555, PixelFormat.Format16bppGrayScale, PixelFormat.Format1bppIndexed, PixelFormat.Format4bppIndexed, PixelFormat.Format8bppIndexed }; } } /// /// 是否为索引像素格式 /// /// /// public static bool IsPixelFormatIndexed(PixelFormat format) { if (IndexedPixelFormats.Contains(format)) { return true; } return false; } /// /// 是否为索引像素格式 /// /// /// public static bool IsPixelFormatIndexed(this Image bitMap) { return IsPixelFormatIndexed(bitMap.PixelFormat); } /// /// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常)) /// /// /// 默认Format32bppArgb /// public static Bitmap CloneC(this Image img, PixelFormat format = PixelFormat.Format32bppArgb) { try { if (!IsPixelFormatIndexed(img.PixelFormat)) { format = img.PixelFormat; } var bmp = new Bitmap(img.Width, img.Height, format); using (var g = Graphics.FromImage(bmp)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height)); } return bmp; } catch { return null; } } /// /// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常)) /// public static Bitmap CloneC(this Image img, float width, float height, PixelFormat format = PixelFormat.Format32bppArgb) { try { if (!IsPixelFormatIndexed(img.PixelFormat)) { format = img.PixelFormat; } var bmp = new Bitmap((int)width, (int)height, format); using (var g = Graphics.FromImage(bmp)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height)); } return bmp; } catch { return null; } } /// /// 在图片上绘制文字信息(图片像素格式不能为像素索引格式) /// /// 绘制文字的图片 /// 文本信息 /// 定位点 /// 字体 /// 字体颜色 /// 水平对齐方式 /// 垂直对齐方式 /// 旋转角度(顺时针) public static void DrawString ( this Graphics g, string text, PointF pf, Font f, Color fc, float angle = 0, StringAlignment horiz = StringAlignment.Near, StringAlignment verti = StringAlignment.Near ) { using (var brush = new SolidBrush(fc)) using (var format = new StringFormat()) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(pf.X, pf.Y); g.RotateTransform(angle); format.Alignment = horiz; format.LineAlignment = verti; g.DrawString(text, f, brush, new PointF(0, 0), format); g.ResetTransform(); } } /// /// 绘制文字信息(图片像素格式不能为像素索引格式) /// /// /// /// 原点 /// 文字依据的点 /// 文字颜色 /// 旋转角度 /// /// public static void DrawString ( this Graphics g, string text, PointF op, SizeF size, Font f, Color fc, float angle = 0, StringAlignment align = StringAlignment.Near, StringAlignment vlign = StringAlignment.Center ) { using (var brush = new SolidBrush(fc)) using (var format = new StringFormat()) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(op.X, op.Y); g.RotateTransform(angle); format.Alignment = align; format.LineAlignment = vlign; g.DrawString(text, f, brush, new RectangleF(0, 0, size.Width, size.Height), format); g.ResetTransform(); } } /// /// 绘制文本 /// /// /// /// /// /// /// /// /// /// public static void DrawString ( this Graphics g, string text, Coordinate info, Font f, Color fc, float scaleX, float scaleY, StringAlignment align = StringAlignment.Near, StringAlignment vlign = StringAlignment.Center ) { using (var brush = new SolidBrush(fc)) using (var format = new StringFormat()) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(info.Origin.X, info.Origin.Y); g.RotateTransform(info.Angle); if (scaleX <= 0) scaleX = 1f; if (scaleY <= 0) scaleY = 1f; g.ScaleTransform(scaleX, scaleY); format.Alignment = align; format.LineAlignment = vlign; var startPoint = new PointF(info.BeforeLeftTop.X - info.Origin.X, info.BeforeLeftTop.Y - info.Origin.Y); startPoint = new PointF(startPoint.X / scaleX, startPoint.Y / scaleY); var size = new SizeF(info.Size.Width / scaleX, info.Size.Height / scaleY); g.DrawString(text, f, brush, new RectangleF(startPoint, size), format); g.ResetTransform(); } } /// /// 绘制图片 /// /// /// /// /// /// /// /// public static void DrawImage ( this Graphics g, Image img, PointF pf, float angle, StringAlignment horiz = StringAlignment.Center, StringAlignment verti = StringAlignment.Center ) { PointF p = new PointF(); switch (horiz) { case StringAlignment.Near: p.X = 0; break; case StringAlignment.Center: p.X = -img.Width / 2; break; case StringAlignment.Far: p.X = -img.Width; break; default: break; } switch (verti) { case StringAlignment.Near: p.Y = 0; break; case StringAlignment.Center: p.Y = -img.Height / 2; break; case StringAlignment.Far: p.Y = -img.Height; break; default: break; } g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(pf.X, pf.Y); g.RotateTransform(angle); g.DrawImage(img, p); g.ResetTransform(); } /// /// 绘制箭头 /// /// /// 开始点 /// 旋转角度 /// 箭头线宽 /// 箭头宽度 /// 箭头长度 /// 箭头颜色 /// /// public static void DrawArrow ( this Graphics g, PointF pf, float angle, float lineWidth, float lineLength, Color lc, float arrowWidth, float arrowLength, Color ac ) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(pf.X, pf.Y); g.RotateTransform(angle); var halfLineWidth = lineWidth / 2; var halfArrowWidth = arrowWidth / 2; lineLength = lineLength - arrowLength; var lp1 = new PointF(0, halfLineWidth); var lp2 = new PointF(lineLength, halfLineWidth); var lp3 = new PointF(lineLength, -halfLineWidth); var lp4 = new PointF(0, -halfLineWidth); var lps = new PointF[] { lp1, lp2, lp3, lp4 }; using (var lb = new SolidBrush(lc)) { g.FillPolygon(lb, lps); } var ap1 = new PointF(lineLength, halfArrowWidth); var ap2 = new PointF(lineLength, -halfArrowWidth); var ap3 = new PointF(lineLength + arrowLength, 0); var aps = new PointF[] { ap1, ap2, ap3 }; using (var ab = new SolidBrush(ac)) { g.FillPolygon(ab, aps); } g.ResetTransform(); } /// /// 画线 /// /// /// /// /// /// /// /// public static void DrawLine ( this Graphics g, PointF pf, float angle, float lineWidth, float lineLength, Color lc, eLineStyle lineStyle ) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TranslateTransform(pf.X, pf.Y); g.RotateTransform(angle); using (var pen = new Pen(lc, lineWidth)) { if (lineStyle == eLineStyle.Dotted) { pen.DashStyle = DashStyle.Custom; pen.DashPattern = new float[] { 10f, 5f }; } //pen.DashStyle=DashStyle.Dash; g.DrawLine(pen, 0, 0, lineLength, 0); } g.ResetTransform(); } /// /// 获取图片物理尺寸(KB) /// /// /// public static long GetPhysicalKb(this Image img) { using (var ms = new MemoryStream()) { img.Save(ms, ImageFormat.Png); return ms.Length / 1024; } } } }