C# 矢量圖EMF 總結

我的知識記錄、若是有用請點贊,不然勿噴、忽略。數組

我的站點:https://i.cnblogs.com/EditPosts.aspx?opt=1ide

注意:句柄的操做
一、建立 代碼以下:ui


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();
}orm

return metafile;對象

二、GDI Graphics 建立 blog

var graphics = Graphics.FromImage(metafile); //也可使用句柄 ip

//有時大小可能設置的很差使 需進行特殊處理
var width=height=0;
graphics.SetClip(new RectangleF(0, 0, width, height));字符串

三、非託管調用代碼get

/// <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);string

/// <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);

四、矢量圖 轉換 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;
}

五、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;
}


六、矢量圖保存

public static void SaveMetafile(Metafile file, string emfName)
{
//MetafileHeader metafileHeader = file.GetMetafileHeader(); //這句話可要可不要
IntPtr iptrMetafileHandle = file.GetHenhmetafile();
CopyEnhMetaFile(iptrMetafileHandle, emfName);
DeleteEnhMetaFile(iptrMetafileHandle);
}

七、轉換base64 字符
var m = (Metafile)Metafile.FromFile(@"EMF.emf"); //加載矢量圖
var by = ConvertMetaFileToByteArray(m); //轉換數組
var ls = Convert.ToBase64String(by); //轉字符串

八、base64轉 byte[]

var bt = Convert.FromBase64String(ls);

九、圖像的經過字符生長以後、可保存操做、不能進行繪製操做、這時須要進行 建立一個新的對象接受這個生成對象、而後操做
var imz = (Metafile)ConvertByteArrayToMetafile(bt);
var jbhtr = imz.GetHenhmetafile();
Metafile mmmmm = new Metafile(jbhtr, true); //new 新對象接收

十、矢量圖的結構播放主要使用: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(); }

相關文章
相關標籤/搜索