using System;
|
using System.Collections.Generic;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Drawing.Imaging;
|
using System.IO;
|
using System.Linq;
|
using System.Text;
|
|
namespace Eventech.DynPicture.Model
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public 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="img"></param>
|
/// <returns></returns>
|
public static bool IsPixelFormatIndexed(this Image img)
|
{
|
return IsPixelFormatIndexed(img.PixelFormat);
|
}
|
|
/// <summary>
|
/// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常))
|
/// </summary>
|
/// <param name="img"></param>
|
/// <param name="format">默认Format32bppArgb</param>
|
/// <returns></returns>
|
public static Image 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 img;
|
}
|
}
|
|
|
/// <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();
|
}
|
}
|
|
public static void DrawString(this Graphics g, string text, ImageInfoCoordinate 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();
|
}
|
|
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;
|
}
|
}
|
|
|
|
|
|
}
|
}
|