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