首次提交:本地项目同步到Gitea
This commit is contained in:
155
LibShapes/Core/Shape/ShapeImage.cs
Normal file
155
LibShapes/Core/Shape/ShapeImage.cs
Normal file
@@ -0,0 +1,155 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user