C# 矢量图EMF 总结
个人知识记录、如果有用请点赞,否则勿喷、忽略。
个人站点:https://i.cnblogs.com/EditPosts.aspx?opt=1
注意:句柄的操作
1、创建 代码如下:
Metafile metafile;
using(Graphics offScreenGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
{
IntPtr hDC = offScreenGraphics.GetHdc();
metafile = new Metafile(hDC,
new Rectangle(0, 0, metafileWidth, metafileHeight),
MetafileFrameUnit.Pixel,
EmfType.EmfPlusOnly);
offScreenGraphics.ReleaseHdc();
}
return metafile;
2、GDI Graphics 创建
var graphics = Graphics.FromImage(metafile); //也可以使用句柄
//有时大小可能设置的不好使 需进行特殊处理
var width=height=0;
graphics.SetClip(new RectangleF(0, 0, width, height));
3、非托管调用代码
/// <summary>
/// 获取矢量图的byte
/// </summary>
/// <param name="hemf"></param>
/// <param name="cbBuffer"></param>
/// <param name="lpbBuffer"></param>
/// <returns></returns>
[DllImport("gdi32.dll")]
public static extern uint GetEnhMetaFileBits(IntPtr hemf, uint cbBuffer, byte[] lpbBuffer);
/// <summary>
/// byte转换矢量图
/// </summary>
/// <param name="cbBuffer"></param>
/// <param name="lpBuffer"></param>
/// <returns></returns>
[DllImport("gdi32.dll")]
public static extern IntPtr SetEnhMetaFileBits(uint cbBuffer, byte[] lpBuffer);
/// <summary>
/// 删除矢量图
/// </summary>
/// <param name="hemf"></param>
/// <returns></returns>
[DllImport("gdi32.dll")]
public static extern bool DeleteEnhMetaFile(IntPtr hemf);
/// <summary>
/// Copy EMF to file
/// </summary>
/// <param name="hemfSrc">Handle to EMF</param>
/// <param name="lpszFile">File</param>
/// <returns></returns>
[DllImport("gdi32.dll")]
private static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc, string lpszFile);
4、矢量图 转换 byte[]
private byte[] ConvertMetaFileToByteArray(Image image)
{
byte[] dataArray = null;
Metafile mf = (Metafile)image;
IntPtr enhMetafileHandle = mf.GetHenhmetafile();
uint bufferSize = GetEnhMetaFileBits(enhMetafileHandle, 0, null);
if (enhMetafileHandle != IntPtr.Zero)
{
dataArray = new byte[bufferSize];
GetEnhMetaFileBits(enhMetafileHandle, bufferSize, dataArray);
}
DeleteEnhMetaFile(enhMetafileHandle);
return dataArray;
}
5、byte[] 转换 矢量图
public static Image ConvertByteArrayToMetafile(byte[] data)
{
Metafile mf = null;
IntPtr hemf = SetEnhMetaFileBits((uint)data.Length, data);
mf = new Metafile(hemf, true);
//DeleteEnhMetaFile(hemf); //如若后续对图像进行操作不能进行删除句柄
return (Image)mf;
}
6、矢量图保存
public static void SaveMetafile(Metafile file, string emfName)
{
//MetafileHeader metafileHeader = file.GetMetafileHeader(); //这句话可要可不要
IntPtr iptrMetafileHandle = file.GetHenhmetafile();
CopyEnhMetaFile(iptrMetafileHandle, emfName);
DeleteEnhMetaFile(iptrMetafileHandle);
}
7、转换base64 字符
var m = (Metafile)Metafile.FromFile(@"EMF.emf"); //加载矢量图
var by = ConvertMetaFileToByteArray(m); //转换数组
var ls = Convert.ToBase64String(by); //转字符串
8、base64转 byte[]
var bt = Convert.FromBase64String(ls);
9、图像的通过字符生长之后、可保存操作、不能进行绘制操作、这时需要进行 创建一个新的对象接受这个生成对象、然后操作
var imz = (Metafile)ConvertByteArrayToMetafile(bt);
var jbhtr = imz.GetHenhmetafile();
Metafile mmmmm = new Metafile(jbhtr, true); //new 新对象接收
10、矢量图的结构播放主要使用:EnumerateMetafileProc 代码如下
public partial class MetafilePlayRecord : Form
{
private Metafile metafile1;
private Graphics.EnumerateMetafileProc metafileDelegate;
public MetafilePlayRecord(Metafile metafile )
{
InitializeComponent();
metafile1 = metafile;
metafileDelegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
}
private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
byte[] dataArray = null;
if (data != IntPtr.Zero)
{
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
//GdipComment
metafile1.PlayRecord(recordType, flags, dataSize, dataArray);
switch (recordType) //记录类型
{
case EmfPlusRecordType.Object: //对象
case EmfPlusRecordType.DrawLines: //线
case EmfPlusRecordType.SetPageTransform: //设置页变换
break;
}
}
Console.WriteLine(recordType.ToString());
return true;
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.EnumerateMetafile(metafile1, destPoint, metafileDelegate);
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
metafile1.Dispose();
}
C# 矢量图EMF 总结的更多相关文章
- protel DXP的类矢量图功能
一.概述 在写论文的过程中,我们经常需要将protel DXP上的原理图贴入到WORD中.我们可以选择使用截图工具,然后再导入到WORD中.但是由于普通截图图形文件都是位图文件,当我们将图形文件导入W ...
- Python matplotlib图片转化成矢量图并裁剪
Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...
- 矢量图和Word:EPS,PDF,EMF和SVG
1.EMF和Word 在学校的时候,我思考过一个问题,论文中的插图如何保证清晰度.关键之一就是使用矢量图.参考知乎问题:如何在论文中画出漂亮的插图?.常见的矢量图包括:EPS,EMF和SVG.SVG适 ...
- C# 导出一个控件的矢量图
调用Control.DrawToBitmap(Bitmap) 方法是很容易得到控件的图形的. 但是bitmap是栅格化图形.栅格化图形有很多缺点,比如文件体积比较大. 放大后失真. 不易编辑等等. 这 ...
- C#中如何生成矢量图
主要的功能就是使用C#画矢量图,然后导出到Word.Excel.Powerpoint中,并且能够再次被编辑.以下是解决过程: 首先应该确定在Office文档中可编辑图形使用的格式:学习了相关资料,了解 ...
- csv读入数据,用julia/matplotlib/pyplot 画矢量图导入word中
这是是用julia来实现画图.julia有三个画图库:Winston.Gadfly.PyPlot 这里用的是pyplot,事实上他是基于matplotlib的 1.首先在juno里安装两个库 juno ...
- 矢量图绘制工具Svg-edit调整画布的大小
矢量图绘制工具Svg-edit调整画布的大小 ------------------------------ ------------------------
- ps中的位图,矢量图,颜色模式
什么是位图?什么是矢量图? 位图是由像素组成的图像,在缩放和旋转的时候容易失真,同时文件容量较大 矢量图是根据几何特性来绘制的图形,通过数学公式计算获得的,不易制作色彩变化太多的图象 颜色模式 RGB ...
- VG.net矢量图和矢量动画开发平台拓扑图软件免费下载
VG.net拓扑图软件是一个基于.net平台的矢量图开发工具,可广泛应用于包括:电力.军工.煤炭.化工.科研.能源等各种监控软件.工作流设计器.电力.化工.煤炭.工控组态软件.仿真.地理信息系统.工作 ...
随机推荐
- python之字符串的拼接总结
加号连接 1.通过+号连接起来 逗号连接 2.通过都好连接起来 但是,这里值得注意的是,只能用于print打印,赋值组操作会生成元组 直接连接 3.直接连接中间有无空格均可 %连接 在python2. ...
- LeetCode 771: 宝石与石头 Jewels and Stones
题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. You're given strings ...
- jQuery-文件上传问题解决
后端要求文件上传需传参数为二进制流,用form-data方式传递,如下图所示: 为了满足该输入参数要求,上传代码如下: <input type="file" id=" ...
- maven配置阿里云仓库镜像
全局配置 修改settting文件 在mirrors标签下添加子节点. <mirror> <id>nexus-aliyun</id> <mirrorOf> ...
- GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及GROUPING应用
前几天,看到一个群友用WITH ROLLUP运算符.由于自个儿没用过,看到概念及结果都云里雾里的,所以突然来了兴趣对生成结果测了一番. 一.概念: WITH CUBE:生成的结果集显示了所选列中值的所 ...
- .NET Core 数据结构与算法 1-1
.NET Core 数据结构与算法 1-1 本节内容为顺序表 简介 线性表是简单.基本.常用的数据结构.线性表是线性结构的抽象 (Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线 ...
- layui table 分页 序号始终从”1“开始解决方法
在用Layui table 分页显示数据,用 type:"numbers" 进行显示序号有以下的问题 1.表格自带的分页,page:true 这种分页,在切换页面的时候序号可以正常 ...
- ArcGIS api for JavaScript 3.27 FindTask查询功能
在ArcGIS API中查询功能是经常使用的,常用的三个查询分别是FindTask,QueryTask,IdentifyTask.它们各自都有自己的特点. 查询功能分为属性查询和空间查询 FindTa ...
- Cesium专栏-克里金插值(全国温度为例,附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- 使用docker安装eolinker
1.下载docker-enlinker git clone https://github.com/psvmc/eolinker-docker.git 2.进入目录 cd eolinker-docker ...