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;
}
}
}
}