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
{
///
/// 图片
///
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(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
}
}