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 TProduct.Extensions
{
///
/// Image 拓展
///
public static class ImageExtension
{
///
/// 获取索引像素格式数组
///
internal static PixelFormat[] IndexedPixelFormats
{
get
{
return new PixelFormat[]
{
PixelFormat.Undefined,
PixelFormat.DontCare,
PixelFormat.Format16bppArgb1555,
PixelFormat.Format16bppGrayScale,
PixelFormat.Format1bppIndexed,
PixelFormat.Format4bppIndexed,
PixelFormat.Format8bppIndexed
};
}
}
///
/// 是否为索引像素格式
///
internal static bool IsPixelFormatIndexed(PixelFormat format)
{
if (IndexedPixelFormats.Contains(format))
return true;
return false;
}
///
/// 是否为索引像素格式
///
public static bool IsPixelFormatIndexed(this Image img)
{
return IsPixelFormatIndexed(img.PixelFormat);
}
///
/// 自定义创建图片的副本(若PixelFormat为索引像素格式会抛异常))
///
public static Image CloneC(this Image img, PixelFormat format = PixelFormat.Format32bppArgb)
{
if (!IsPixelFormatIndexed(img.PixelFormat))
{
format = img.PixelFormat;
}
var bmp = new Bitmap(img.Width, img.Height, format);
using (var g = Graphics.FromImage(bmp))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height));
}
return bmp;
}
///
/// 绘制成椭圆图片
///
public static Image CutEllipse(this Image img, Size size)
{
var bitmap = new Bitmap(size.Width, size.Height);
using (var g = Graphics.FromImage(bitmap))
{
using (TextureBrush br = new TextureBrush(img, WrapMode.Clamp, new Rectangle(Point.Empty, img.Size)))
{
br.ScaleTransform(bitmap.Width / (float)img.Width, bitmap.Height / (float)img.Height);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillEllipse(br, new Rectangle(Point.Empty, size));
}
}
return bitmap;
}
///
///自定义为图片生成缩略图
///
public static Image GetThumbnailC(this Image img, int width, int height)
{
Bitmap bmp = new Bitmap(width, height);
using (var g = Graphics.FromImage(bmp))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(img, new Rectangle(Point.Empty, bmp.Size));
}
return bmp;
}
///
/// 自定义为图片生成缩略图
///
public static Image GetThumbnailC(this Image img, Size size)
{
return GetThumbnailC(img, size.Width, size.Height);
}
///
/// 通过系统新建生成缩略图
///
public static Image GetThumbnailN(this Image img, Size size)
{
return new Bitmap(img, size);
}
///
/// 通过过系统新建生成缩略图
///
public static Image GetThumbnailN(this Image img, int width, int height)
{
return new Bitmap(img, width, height);
}
///
/// 调用系统方法生成缩略图
///
public static Image GetThumbnailS(this Image img, Size size)
{
return img.GetThumbnailImage(size.Width, size.Height, null, System.IntPtr.Zero);
}
///
/// 调用系统方法生成缩略图
///
public static Image GetThumbnailS(this Image img, int width, int height)
{
return img.GetThumbnailImage(width, height, null, System.IntPtr.Zero);
}
///
/// 在图片上绘制文字信息(图片像素格式不能为像素索引格式)
///
/// 绘制文字的图片
/// 文本信息
/// 定位点
/// 字体
/// 字体颜色
/// 水平对齐方式
/// 垂直对齐方式
/// 旋转角度(顺时针)
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(PointF.Empty, size), format);
g.ResetTransform();
}
}
///
/// 绘制文字信息(图片像素格式不能为像素索引格式)
///
///
///
///
///
///
///
///
///
///
///
///
public static void DrawString(this Graphics g, string text, PointF op, RectangleF recf, Font f, Color fc, float angle = 0, float scaleX = 1f, float scaleY = 1f, 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);
if (scaleX <= 0)
scaleX = 1f;
if (scaleY <= 0)
scaleY = 1f;
g.ScaleTransform(scaleX, scaleY);
format.Alignment = align;
format.LineAlignment = vlign;
var startPoint = new PointF(recf.X - op.X, recf.Y - op.Y);
startPoint = new PointF(startPoint.X / scaleX, startPoint.Y / scaleY);
var new_size = new SizeF(recf.Width / scaleX, recf.Height / scaleY);
g.DrawString(text, f, brush, new RectangleF(startPoint, new_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, DashStyle? dashStyle = null)
{
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 (dashStyle != null)
{
pen.DashStyle = dashStyle.Value;
if (pen.DashStyle == DashStyle.Dash)
{
pen.DashPattern = new float[] { 10f, 5f };
}
}
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;
}
}
///
/// 压缩图片
///
/// 原图
/// 压缩等级1-100 越小压缩程度越高
/// 最终压缩的尺寸
public static Image CompressImage(this Image img, int level = 90, int size = 300)
{
try
{
var orignSize = img.GetPhysicalKb();
if (orignSize <= size)
return img.CloneC();
if (level < 1)
level = 1;
if (level > 100)
level = 100;
ImageFormat tFormat = img.RawFormat;
int dHeight = img.Height / 2;
int dWidth = img.Width / 2;
int sW = 0, sH = 0;
//按比例缩放
Size tem_size = new Size(img.Width, img.Height);
if (tem_size.Width > dHeight || tem_size.Width > dWidth)
{
if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
{
sW = dWidth;
sH = (dWidth * tem_size.Height) / tem_size.Width;
}
else
{
sH = dHeight;
sW = (tem_size.Width * dHeight) / tem_size.Height;
}
}
else
{
sW = tem_size.Width;
sH = tem_size.Height;
}
using (var bitmap = new Bitmap(dWidth, dHeight))
{
using (var g = Graphics.FromImage(bitmap))
{
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(img, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
}
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = level;//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
using (var stream = new MemoryStream())
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[x];
break;
}
}
if (jpegICIinfo != null)
{
bitmap.Save(stream, jpegICIinfo, ep);
}
else
{
bitmap.Save(stream, tFormat);
}
if (stream.Length > 1024 * size)
{
level -= 10;
return CompressImage(bitmap, level, size);
}
else
{
return Image.FromStream(stream);
}
}
}
}
catch (Exception)
{
return null;
}
}
}
}