namespace Yw.WinFrmUI.HydroL2d
|
{
|
/// <summary>
|
/// 图片拓展
|
/// </summary>
|
internal static class ImageExtension
|
{
|
/// <summary>
|
/// 获取索引像素格式数组
|
/// </summary>
|
public static PixelFormat[] IndexedPixelFormats
|
{
|
get
|
{
|
return new PixelFormat[]
|
{
|
PixelFormat.Undefined,
|
PixelFormat.DontCare,
|
PixelFormat.Format16bppArgb1555,
|
PixelFormat.Format16bppGrayScale,
|
PixelFormat.Format1bppIndexed,
|
PixelFormat.Format4bppIndexed,
|
PixelFormat.Format8bppIndexed
|
};
|
}
|
}
|
|
/// <summary>
|
/// 是否为索引像素格式
|
/// </summary>
|
/// <param name="format"></param>
|
/// <returns></returns>
|
public static bool IsPixelFormatIndexed(PixelFormat format)
|
{
|
if (IndexedPixelFormats.Contains(format))
|
{
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 是否为索引像素格式
|
/// </summary>
|
/// <param name="bitMap"></param>
|
/// <returns></returns>
|
public static bool IsPixelFormatIndexed(this Image bitMap)
|
{
|
return IsPixelFormatIndexed(bitMap.PixelFormat);
|
}
|
|
/// <summary>
|
/// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常))
|
/// </summary>
|
/// <param name="img"></param>
|
/// <param name="format">默认Format32bppArgb</param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常))
|
/// </summary>
|
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;
|
}
|
}
|
|
|
/// <summary>
|
/// 在图片上绘制文字信息(图片像素格式不能为像素索引格式)
|
/// </summary>
|
/// <param name="g">绘制文字的图片</param>
|
/// <param name="text">文本信息</param>
|
/// <param name="pf">定位点</param>
|
/// <param name="f">字体</param>
|
/// <param name="fc">字体颜色</param>
|
/// <param name="horiz">水平对齐方式</param>
|
/// <param name="verti">垂直对齐方式</param>
|
/// <param name="angle">旋转角度(顺时针)</param>
|
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();
|
}
|
}
|
|
/// <summary>
|
/// 绘制文字信息(图片像素格式不能为像素索引格式)
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="text"></param>
|
/// <param name="op">原点</param>
|
/// <param name="pf">文字依据的点</param>
|
/// <param name="fc">文字颜色</param>
|
/// <param name="angle">旋转角度</param>
|
/// <param name="horiz"></param>
|
/// <param name="verti"></param>
|
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();
|
}
|
}
|
|
/// <summary>
|
/// 绘制文本
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="text"></param>
|
/// <param name="info"></param>
|
/// <param name="f"></param>
|
/// <param name="fc"></param>
|
/// <param name="scaleX"></param>
|
/// <param name="scaleY"></param>
|
/// <param name="align"></param>
|
/// <param name="vlign"></param>
|
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();
|
}
|
}
|
|
|
|
/// <summary>
|
/// 绘制图片
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="img"></param>
|
/// <param name="pf"></param>
|
/// <param name="angle"></param>
|
/// <param name="?"></param>
|
/// <param name="horiz"></param>
|
/// <param name="verti"></param>
|
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();
|
}
|
|
/// <summary>
|
/// 绘制箭头
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="pf">开始点</param>
|
/// <param name="angle">旋转角度</param>
|
/// <param name="lineWidth">箭头线宽</param>
|
/// <param name="arrowWidth">箭头宽度</param>
|
/// <param name="arrowLength">箭头长度</param>
|
/// <param name="ac">箭头颜色</param>
|
/// <param name="horiz"></param>
|
/// <param name="verti"></param>
|
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();
|
}
|
|
/// <summary>
|
/// 画线
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="pf"></param>
|
/// <param name="angle"></param>
|
/// <param name="lineWidth"></param>
|
/// <param name="lineLength"></param>
|
/// <param name="lc"></param>
|
/// <param name="lineStyle"></param>
|
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();
|
}
|
|
/// <summary>
|
/// 获取图片物理尺寸(KB)
|
/// </summary>
|
/// <param name="img"></param>
|
/// <returns></returns>
|
public static long GetPhysicalKb(this Image img)
|
{
|
using (var ms = new MemoryStream())
|
{
|
img.Save(ms, ImageFormat.Png);
|
return ms.Length / 1024;
|
}
|
}
|
|
|
|
|
|
}
|
}
|