156 lines
4.5 KiB
C#
156 lines
4.5 KiB
C#
|
|
using Newtonsoft.Json;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.Drawing.Drawing2D;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
|
|||
|
|
namespace Io.Github.Kerwinxu.LibShapes.Core.Shape
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 图片
|
|||
|
|
/// </summary>
|
|||
|
|
public class ShapeImage : ShapeVar
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
public ShapeImage()
|
|||
|
|
{
|
|||
|
|
IsFill = true; // 这样可以方便的选择。
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这个不用ShapeVar中的StaticText,是因为我不想显示,并且也不用GetText,是因为这个默认情况下,变量意味着路径,而Img意味着静态的图片。
|
|||
|
|
[Browsable(false)]//不在PropertyGrid上显示
|
|||
|
|
public string Img { get; set; }
|
|||
|
|
|
|||
|
|
public override ShapeEle DeepClone()
|
|||
|
|
{
|
|||
|
|
// 这里用json的方式
|
|||
|
|
string json = JsonConvert.SerializeObject(this);
|
|||
|
|
return JsonConvert.DeserializeObject<ShapeImage>(json);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void Draw(Graphics g, Matrix matrix)
|
|||
|
|
{
|
|||
|
|
// 请注意,我这个算法是有瑕疵的,
|
|||
|
|
// 这个角度实际上应该是最小内接矩形的角度,
|
|||
|
|
// 这个是个小项目,应用场景是简单的图形操作,
|
|||
|
|
// 如果群组里套图形加上群组有角度,会产生偏差。
|
|||
|
|
// 1.0首先取得没有变换前的坐标
|
|||
|
|
var path = GetGraphicsPath(matrix);
|
|||
|
|
var rect = path.GetBounds(); // 外接矩形,如果是内接矩形是最准的。
|
|||
|
|
var centerPoint = new PointF() // 中心点的坐标
|
|||
|
|
{
|
|||
|
|
X = rect.X + rect.Width/2,
|
|||
|
|
Y= rect.Y + rect.Height/2
|
|||
|
|
};
|
|||
|
|
// 2. 取得图片对象
|
|||
|
|
var bitmap = getImg();
|
|||
|
|
if (bitmap != null)
|
|||
|
|
{
|
|||
|
|
// 3. 转换。
|
|||
|
|
Matrix matrix1 = new Matrix();
|
|||
|
|
matrix1.RotateAt(this.Angle, centerPoint);
|
|||
|
|
g.Transform = matrix1; // 应用这个变换。
|
|||
|
|
// 4.
|
|||
|
|
// todo 以后添加上拉伸的判断。
|
|||
|
|
g.DrawImage(bitmap, rect.X, rect.Y, rect.Width, rect.Height);
|
|||
|
|
|
|||
|
|
//5.
|
|||
|
|
g.ResetTransform(); // 取消这个变换
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//base.Draw(g, matrix);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private Bitmap getImg()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(this.VarName))
|
|||
|
|
{
|
|||
|
|
return Base64StringToImage(this.Img);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 这里表示是有路径
|
|||
|
|
if (File.Exists(this.VarValue))
|
|||
|
|
{
|
|||
|
|
// 如果路径存在
|
|||
|
|
return (Bitmap)Image.FromFile(this.VarValue);
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//throw;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override GraphicsPath GetGraphicsPathWithAngle()
|
|||
|
|
{
|
|||
|
|
return base.GetGraphicsPathWithAngle();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region 文本和图像的转换
|
|||
|
|
public static string ImgToBase64String(Bitmap bmp)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//如下是为了预防GDI一般性错误而深度复制
|
|||
|
|
Bitmap bmp2 = new Bitmap(bmp);
|
|||
|
|
|
|||
|
|
MemoryStream ms = new MemoryStream();
|
|||
|
|
bmp2.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
byte[] arr = new byte[ms.Length];
|
|||
|
|
ms.Position = 0;
|
|||
|
|
ms.Read(arr, 0, (int)ms.Length);
|
|||
|
|
ms.Close();
|
|||
|
|
String strbaser64 = Convert.ToBase64String(arr);
|
|||
|
|
|
|||
|
|
bmp2.Dispose();
|
|||
|
|
|
|||
|
|
return strbaser64;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//base64编码的文本 转为图片
|
|||
|
|
public static Bitmap Base64StringToImage(string strbaser64)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
byte[] arr = Convert.FromBase64String(strbaser64);
|
|||
|
|
MemoryStream ms = new MemoryStream(arr);
|
|||
|
|
Bitmap bmp = new Bitmap(ms);
|
|||
|
|
ms.Close();
|
|||
|
|
|
|||
|
|
return bmp;
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
return new Bitmap(10, 10);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|