當繪圖遇上Caché之元數據代理

很久以前到瀋陽實習的時候還一個個問度娘C#畫圖。畫了電路圖繪製軟件的畢業設計、雪花屏保等等。搞LIS軟件後繪製各種儀器圖。對C#畫筆、畫字符串、畫線、畫圓等等耳熟能詳。然而卻碰到一個問題,我們的儀器大部分是盒子用數據庫M連接的,如果盒子儀器需要出圖怎麼辦?很長一段時間我也沒有辦法,知道我用M調C#的webservice之後。就如同打開一個大門一樣,我可以把所有M實現不了的都通過webservice調用C#的實現類實現功能。基於此真的實現了貝克曼DXH800,電泳V8,電泳EPLAY,邁瑞5800等儀器的出圖,表示發現新大陸很嗨皮。如以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{
    ///<summary  NoteObject="Class">
    /// [功能描述:M調用繪圖測試] <para/>
    /// [創建者:zlz] <para/>
    /// [創建時間:2018年03月22日] <para/>
    ///<說明>
    ///  [說明:[功能描述:M調用繪圖測試,配合M處理儀器繪圖]<para/>
    ///</說明>
    ///<修改記錄>
    ///    [修改時間:本次修改時間]<para/>
    ///    [修改內容:本次修改內容]<para/>
    ///</修改記錄>
    ///<修改記錄>
    ///    [修改時間:本次修改時間]<para/>
    ///    [修改內容:本次修改內容]<para/>
    ///    M端觸發代碼,其他的和監聽程序一樣
    ///    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDrawImageAsyncHandlerSoap).%New()
    ///    s ret=retObj.DrawImage("1","繪圖數據","儀器","處理M","傳輸次數","其他參數","LIS.Mach.ImageDeal.ImageDealTest,LIS.Mach.ImageDeal")
    ///    s ret=$$DealImage^MI.MIF000(epis,"整個BC3000的數據,繪圖自己提取繪圖數據",mi,"和監聽一樣的有保存圖片的M類","-1","","LIS.Mach.ImageDeal.ImageDealBC3000Plus,LIS.Mach.ImageDeal")
    ///</修改記錄>
    ///</summary>
    public class ImageDealBC3000Plus : BaseDeal, IDrawImage
    {
        /// <summary>
        /// 繪圖方法
        /// </summary>
        /// <param name="epis">流水號</param>
        /// <param name="result">結果</param>
        /// <param name="machID">儀器ID</param>
        /// <param name="dealProcess">處理M</param>
        /// <param name="index">-1認爲傳到最後</param>
        /// <param name="otherPara">其他參數</param>
        /// <param name="dealClass">C#處理類格式:類全名,不帶後綴的動態庫名</param>
        /// <returns>是否成功</returns>
        public bool DrawImage(string epis, string result, string machID, string dealProcess, string index, string otherPara, string dealClass)
        {
            if (result.Length > 2304)
            {
                string imgStr = result.Substring(result.Length - 2304, 2304);
                
                //每個圖256*3表示  依次是WBC RBC PLT
                for (int i = 0; i < 3; i++)
                {
                    string oneImgStr = imgStr.Substring(i*768,768);
                    float maxVal = 0;
                    float [] points = new float[256];
                    for (int j = 0; j < 256; j++)
                    {
                        string onePoint = oneImgStr.Substring(j*3,3);
                        float curVal = Convert.ToInt32(onePoint);
                        if(maxVal<curVal)
                        {
                            maxVal=curVal;
                        }
                        points[j]=curVal;
                    }
                    //圖片類別
                    string imgClass = "";
                    if (i == 0)
                    {
                        imgClass = "WBC";
                    }
                    else if (i == 1)
                    {
                        imgClass = "RBC";
                    }
                    else if (i == 2)
                    {
                        imgClass = "PLT";
                    }
                    Dictionary<int, string> xshow = new Dictionary<int, string>();
                    if (imgClass == "RBC")
                    {
                        xshow.Add(10, "0");
                        xshow.Add(60, "50");
                        xshow.Add(110, "100");
                        xshow.Add(160, "150");
                        xshow.Add(210, "200");
                        xshow.Add(260, "250");
                        xshow.Add(310, "fL");
                    }
                    if (imgClass == "PLT")
                    {
                        xshow.Add(10, "0");
                        xshow.Add(50, "5");
                        xshow.Add(100, "10");
                        xshow.Add(150, "15");
                        xshow.Add(200, "20");
                        xshow.Add(250, "25");
                        xshow.Add(300, "fL");
                    }
                    //按十進制結果畫圖
                    Histogram histogram = new Histogram("", imgClass, 256, maxVal, "0", 329, 128, xshow);
                    histogram.Values = points;
                    Bitmap img = histogram.CreateImage();


                    //判斷C盤trak是否存在
                    string tmpPath = @"c:\trak\tmpMach";
                    if (!Directory.Exists("C:\\trak"))
                    {
                        Directory.CreateDirectory("C:\\trak"); //新建文件夾   
                        if (!Directory.Exists(tmpPath))
                        {
                            Directory.CreateDirectory(tmpPath); //新建文件夾   
                        }
                    }
                    
                    //先刪除臨時目錄裏面的所有文件
                    DeleteFolder(tmpPath);
                    img.Save(tmpPath + "\\" + imgClass + epis + ".bmp");
                    img.Dispose();
                    string ftpPath = "";
                    FtpService ftp = GetFtpHelper(machID, dealProcess, out ftpPath);
                    //上傳圖片
                    ftp.Upload(tmpPath + "\\" + imgClass + epis + ".bmp");
                    //保存圖片
                    SaveImg(machID, epis, imgClass, ftpPath.Split('^')[3] + imgClass + epis + ".bmp", dealProcess);
                    File.Delete(tmpPath + "\\" + imgClass + epis + ".bmp");
                }
            }
            return true;
        }


        /// 清空指定的文件夾,但不刪除文件夾
        /// </summary>
        /// <param name="dir"></param>
        public static void DeleteFolder(string dir)
        {
            foreach (string d in Directory.GetFileSystemEntries(dir))
            {
                if (File.Exists(d))
                {
                    FileInfo fi = new FileInfo(d);
                    if ((DateTime.Now - fi.CreationTime).Minutes > 10)
                    {
                        if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
                        {
                            fi.Attributes = FileAttributes.Normal;
                        }
                        File.Delete(d);//直接刪除其中的文件  
                    }
                }
                else
                {
                    DirectoryInfo d1 = new DirectoryInfo(d);
                    if (d1.GetFiles().Length != 0)
                    {
                        DeleteFolder(d1.FullName);////遞歸刪除子文件夾
                    }
                    Directory.Delete(d);
                }
            }
        }

    }
}

然而還是有新的問題出現,新的問題就是C#的編譯語言,畫圖調試要不停改代碼、編譯、替換到網站、傳數據測試。這是一個很費時的事,而且C#各種沒設置對象到實例等報錯必須看日誌猜測,效率極其低下,基本也就我在使用。最近突然靈光一閃,我可以借用代理模式把我們打印的畫筆元數據定義的實現代理出去,和打印一樣約定畫筆的元數據,別的語言把畫圖數據傳給C#,C#按數據執行畫文本、畫條碼、畫線等等。基於這個原理我就能實現M語言的圖片類。

結構圖
設計結構圖

C#元素執行類(按元素數據執行畫筆)

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Drawing.Printing;
using System.Drawing;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Net;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Drawing.Drawing2D;

namespace LIS.Mach.ImageDeal
{

    /// <summary>
    /// 報告處理類,處理報告打印邏輯
    /// </summary>
    public partial class DrawElementBase
    {
        /// <summary>
        /// 縮放倍數
        /// </summary>
        int dpi = 1;

        /// <summary>
        /// 名稱表
        /// </summary>
        private static DataTable namesTable;


        /// <summary>
        /// 存打印的起始點
        /// </summary>
        List<Point> pintPoints = new List<Point>();



        /// <summary>
        /// 行索引
        /// </summary>
        int iRow;

        /// <summary>
        /// 行索引
        /// </summary>
        int endRow;

        /// <summary>
        /// 無參構造函數
        /// </summary>
        public DrawElementBase()
        {
        }

        /// <summary>
        /// 繪圖服務
        /// </summary>
        /// <param name="drawDT">繪圖數據表</param>
        /// <returns>圖片</returns>
        public Bitmap DrawService(DataTable drawDT)
        {
            if (drawDT != null && drawDT.Rows.Count > 0)
            {
                namesTable = drawDT;
                iRow = 1;
                endRow = namesTable.Rows.Count;
                //第一個元素指定圖片信息
                DataRow imgInfoRow = namesTable.Rows[0];
                //PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle
                //打印類型
                string PrintType = imgInfoRow["PrintType"].ToString();
                if (PrintType == "ImageInfo")
                {
                    int PrintWidth = Convert.ToInt32(imgInfoRow["PrintWidth"]);
                    int PrintHeight = Convert.ToInt32(imgInfoRow["PrintHeight"]);
                    string PrintColor = imgInfoRow["PrintColor"].ToString();
                    Color bkColor = Color.White;
                    if (PrintColor != "")
                    {
                        bkColor = System.Drawing.ColorTranslator.FromHtml(PrintColor);
                    }
                    Bitmap img = new Bitmap(PrintWidth, PrintHeight);
                    Graphics g = Graphics.FromImage(img);
                    g.Clear(bkColor);
                    //+抗鋸齒
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    //調用繪圖
                    PrintDraw(g, null, false);
                    return img;
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }

     
        /// <summary>
        /// 打印繪製
        /// </summary>
        /// <param name="pg">繪圖句柄</param>
        /// <param name="pe">打印參數</param>
        /// <param name="e">是否自動換頁</param>
        bool PrintDraw(Graphics pg, PrintPageEventArgs pe,bool isAutoChangePage)
        {
            try
            {
                //奇偶頁打印
                if (pintPoints.Count > 0)
                {
                    iRow = pintPoints[0].X;
                    endRow = pintPoints[0].Y;
                    pintPoints.RemoveAt(0);
                }
                //循環繪製每行數據
                for (int i = iRow; i < endRow; i++)
                {
                    //取出當前行數據
                    DataRow dr = namesTable.Rows[i];
                    //PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment
                    //打印類型
                    string PrintType = dr["PrintType"].ToString();
                    //換頁
                    if (isAutoChangePage==false&&PrintType == "PAGE")
                    {
                        iRow = i + 1;
                        if (pe == null)
                        {
                            return true;
                        }
                        pe.HasMorePages = true;
                        return true;
                    }
                    //打印X
                    float PrintX = Convert.ToSingle(dr["PrintX"].ToString());
                    //打印Y
                    float PrintY = Convert.ToSingle(dr["PrintY"].ToString());
                    //打印字體
                    string PrintFont = dr["PrintFont"].ToString();
                    //字體大小
                    float PrintFontSize = 9;
                    //指定了字體大小使用指定的字體大小
                    if (!String.IsNullOrEmpty(dr["PrintFontSize"].ToString()))
                    {
                        PrintFontSize = Convert.ToSingle(dr["PrintFontSize"].ToString());
                    }
                    //字體樣式
                    string PrintFontStyle = dr["PrintFontStyle"].ToString();
                    //打印寬度
                    float PrintWidth = Convert.ToSingle(dr["PrintWidth"].ToString());
                    //打印高度
                    float PrintHeight = Convert.ToSingle(dr["PrintHeight"].ToString());
                    //打印文本
                    string PrintText = dr["PrintText"].ToString();
                    //數據字段
                    string DataField = dr["DataField"].ToString();
                    //打印標識
                    string PrintFlag = dr["PrintFlag"].ToString();
                    //打印停靠
                    string PrintAlignment = dr["PrintAlignment"].ToString();
                    //打印圖片文件
                    string PrintImageFile = dr["PrintImageFile"].ToString();
                    //打印顏色
                    string PrintColor = "";
                    //設置了顏色就使用設置的顏色
                    if (!String.IsNullOrEmpty(dr["PrintColor"].ToString()))
                    {
                        PrintColor = dr["PrintColor"].ToString();
                    }
                    //標識打印
                    bool bPrint = true;
                    //空標籤不打印
                    if (String.IsNullOrEmpty(PrintText) && (PrintType == "Label"))
                    {
                        bPrint = false;
                    }
                    //空數據不打印
                    if (String.IsNullOrEmpty(PrintText) && (PrintType == "Data"))
                    {
                        bPrint = false;
                    }
                    //空結果不打印
                    if (String.IsNullOrEmpty(PrintText) && (PrintType == "Result"))
                    {
                        bPrint = false;
                    }
                    //最小化不打印
                    if (String.IsNullOrEmpty(PrintText) && (PrintType == "Microbe"))
                    {
                        bPrint = false;
                    }
                    //如果需要打印
                    if (bPrint)
                    {
                        //不允許文字畫出界限
                        using (StringFormat drawFormat = new StringFormat(StringFormatFlags.NoClip))
                        {
                            //如果垂直顯示,有數據兼容
                            if (dr.Table.Columns.Contains("IsVShow") && dr["IsVShow"].ToString() == "1")
                            {
                                drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;
                            }
                            //設置文字停靠
                            switch (PrintAlignment)
                            {
                                case "Center":
                                    PrintX = PrintX + PrintWidth / 2;
                                    drawFormat.Alignment = StringAlignment.Center;
                                    break;
                                case "Right":
                                    PrintX = PrintX + PrintWidth;
                                    drawFormat.Alignment = StringAlignment.Far;
                                    break;
                                case "Justified":
                                    //自適應的就不管了
                                    break;
                                default:
                                    //否則默認停靠
                                    drawFormat.Alignment = StringAlignment.Near;
                                    break;
                            }
                            //文本擴大倍數
                            double fontSizeDpi = 1;
                            //解析得到字體
                            Font mFont = ResolveFontData(PrintFont, (float)(PrintFontSize * fontSizeDpi), PrintFontStyle);
                            //解析顏色得到畫刷
                            Brush mBrush = ResolveColorData(PrintColor);

                            bool pure = false;
                            //條碼類型
                            string BarType = "";
                            if (PrintFlag.ToUpper().Contains("BARCODEN"))
                            {
                                PrintFlag = "BarCodeN";
                                if (PrintFlag.ToUpper() == "BARCODENA")
                                {
                                    BarType = "A";
                                }
                                else if (PrintFlag.ToUpper() == "BARCODENB")
                                {
                                    BarType = "B";
                                }
                                else if (PrintFlag.ToUpper() == "BARCODENC")
                                {
                                    BarType = "C";
                                }
                            }
                            else if (PrintFlag.ToUpper().Contains("BARCODE"))
                            {
                                PrintFlag = "BarCode";
                                if (PrintFlag.ToUpper() == "BARCODEA")
                                {
                                    BarType = "A";
                                }
                                else if (PrintFlag.ToUpper() == "BARCODEB")
                                {
                                    BarType = "B";
                                }
                                else if (PrintFlag.ToUpper() == "BARCODEC")
                                {
                                    BarType = "C";
                                }
                            }
                            string rotate = "";
                            //如果是數據類型,且打印標識是條碼,設置打印類型爲條碼
                            if ((PrintType == "Data") && (PrintFlag.ToUpper() == "BARCODE"))
                            {
                                PrintType = "BarCode";
                            }
                            //如果是數據類型,且打印標識是條碼,設置打印類型爲條碼
                            if ((PrintType == "Data") && (PrintFlag.ToUpper() == "BARCODEN"))
                            {
                                PrintType = "BarCodeN";
                            }
                            //旋轉角度
                            string Angle = "";
                            //有數據兼容
                            if (dr.Table.Columns.Contains("Angle"))
                            {
                                Angle = dr["Angle"].ToString();
                            }
                            //旋轉角度
                            int angle = 0;
                            if (Angle != "")
                            {
                                angle = Convert.ToInt32(Angle);
                            }
                            if (angle != 0)
                            {
                                // 繪圖平面以圖片的中心點旋轉
                                pg.TranslateTransform(PrintX, PrintY);//通過使此 pDC 的變換矩陣左乘指定的平移來更改座標系統的原點
                                PrintX = 0;
                                PrintY = 0;
                                //將指定旋轉應用於此 pDC的變換矩陣
                                pg.RotateTransform(angle);
                            }
                            if (PrintType=="Label" || PrintType == "Data")
                            {
                                if (PrintFlag == "CheckBox")
                                {
                                    PrintType = "CheckBox";
                                }
                                else if (PrintFlag == "Radio")
                                {
                                    PrintType = "Radio";
                                }
                            }
                            //按照類型來繪製信息
                            switch (PrintType)
                            {
                                //標籤
                                case "Label":
                                    //包含大小控制命令
                                    if (PrintText.Contains("$SIZE$"))
                                    {
                                        DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
                                        continue;
                                    }
                                    #region 冪打印處理
                                    //冪打印處理
                                    if (PrintText.Contains("^"))
                                    {
                                        string[] powerArr = PrintText.Split('^');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY-2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    else if (PrintText.Contains("~"))
                                    {
                                        string[] powerArr = PrintText.Split('~');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY - 2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    #endregion
                                    pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                    break;
                                //數據
                                case "Data":
                                    //包含大小控制命令
                                    if (PrintText.Contains("$SIZE$"))
                                    {
                                        DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
                                        continue;
                                    }
                                    #region 冪打印處理
                                    //冪打印處理
                                    if (PrintText.Contains("^"))
                                    {
                                        string[] powerArr = PrintText.Split('^');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY - 2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    else if (PrintText.Contains("~"))
                                    {
                                        string[] powerArr = PrintText.Split('~');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0]+"^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY-2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    #endregion
                                    pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                    break;
                                //複選框
                                case "CheckBox":
                                    //直接從地址加載圖片
                                    Image imgck=null;
                                    if (PrintText == "是")
                                    {
                                        imgck = Properties.Resources.checkboxtrue;
                                    }
                                    else
                                    {
                                        imgck = Properties.Resources.checkboxflse;
                                    }
                                    //下載後畫圖
                                    if (imgck != null)
                                    {
                                        pg.DrawImage(imgck, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                    }
                                    imgck.Dispose();
                                    imgck = null;
                                    break;
                                //單選選框
                                case "Radio":
                                    //直接從地址加載圖片
                                    Image imgrd = null;
                                    if (PrintText == "是")
                                    {
                                        imgrd = Properties.Resources.radiotrue;
                                    }
                                    else
                                    {
                                        imgrd = Properties.Resources.radiofalse;
                                    }
                                    //下載後畫圖
                                    if (imgrd != null)
                                    {
                                        pg.DrawImage(imgrd, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                    }
                                    imgrd.Dispose();
                                    imgrd = null;
                                    break;
                                //結果
                                case "Result":
                                    //包含大小控制命令
                                    if (PrintText.Contains("$SIZE$"))
                                    {
                                        DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
                                        continue;
                                    }
                                    #region 冪打印處理
                                    //冪打印處理
                                    if (PrintText.Contains("^"))
                                    {
                                        string[] powerArr = PrintText.Split('^');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX - 2) * dpi, (PrintY - 2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    else if (PrintText.Contains("~"))
                                    {
                                        string[] powerArr = PrintText.Split('~');
                                        if (powerArr.Length == 2)
                                        {
                                            if (StrIsInt(powerArr[1]) == true)
                                            {
                                                SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
                                                pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                                //解析得到字體
                                                Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
                                                pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX - 2) * dpi, (PrintY - 2) * dpi, drawFormat);
                                                continue;
                                            }
                                        }
                                    }
                                    #endregion
                                    pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                    pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                    break;
                                //微生物
                                case "Microbe":
                                    pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
                                    break;
                                //線
                                case "ILine":
                                    float penwidth = PrintHeight;
                                    float xpianyi = 0;
                                    float ypianyi = 0;
                                    //豎線,
                                    if (PrintWidth < PrintHeight)
                                    {
                                        penwidth = PrintWidth;
                                        xpianyi = 0;
                                        ypianyi = PrintHeight;
                                    }
                                    //橫向
                                    else
                                    {
                                        xpianyi = PrintWidth;
                                        ypianyi = 0;
                                    }
                                    Color lineColor = Color.Black;
                                    if (PrintColor != "")
                                    {
                                        lineColor = System.Drawing.ColorTranslator.FromHtml(PrintColor);
                                    }
                                    Pen pen = new Pen(lineColor, penwidth * dpi);
                                    //打印標識
                                    if (PrintFlag == "0")
                                    {
                                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
                                    }
                                    else if (PrintFlag == "1")
                                    {
                                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                                        if (dpi > 4)
                                        {
                                            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom; 
                                            pen.DashPattern = new float[] { 30, 20 };
                                        }
                                    }
                                    else if (PrintFlag == "2")
                                    {
                                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                                    }
                                    else if (PrintFlag == "3")
                                    {
                                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
                                    }
                                    else if (PrintFlag == "4")
                                    {
                                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                                    }
                                    pg.DrawLine(pen, PrintX * dpi, PrintY * dpi, PrintX * dpi + xpianyi * dpi, PrintY * dpi + ypianyi * dpi);
                                    break;
                                //線
                                case "ILineN":
                                    float size = 2;
                                    //設置了顏色就使用設置的顏色
                                    if (!String.IsNullOrEmpty(dr["PrintLength"].ToString()))
                                    {
                                        size = Convert.ToSingle(dr["PrintLength"]);
                                    }
                                    Color lineColorN = Color.Black;
                                    if (PrintColor != "")
                                    {
                                        lineColorN = System.Drawing.ColorTranslator.FromHtml(PrintColor);
                                    }
                                    Pen penN = new Pen(lineColorN, size * dpi);
                                    //打印標識
                                    if (PrintFlag == "0")
                                    {
                                        penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
                                    }
                                    else if (PrintFlag == "1")
                                    {
                                        penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                                        if (dpi > 4)
                                        {
                                            penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
                                            penN.DashPattern = new float[] { 30, 20 };
                                        }
                                    }
                                    else if (PrintFlag == "2")
                                    {
                                        penN.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                                    }
                                    else if (PrintFlag == "3")
                                    {
                                        penN.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
                                    }
                                    else if (PrintFlag == "4")
                                    {
                                        penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                                    }
                                    pg.DrawLine(penN, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                    break;
                                //條碼
                                case "BarCode":
                                    try
                                    {
                                        printBarcode(pg, PrintX.ToString(), PrintY.ToString(), PrintWidth.ToString(), PrintHeight.ToString(), pure, BarType, rotate, PrintText, true, mFont);
                                    }
                                    catch (Exception ex)
                                    {
                                        WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 調用堆棧:" + ex.StackTrace));
                                    }
                                    break;
                                //條碼
                                case "BarCodeN":
                                    try
                                    {
                                        //是否畫文本
                                        bool isDrawText = false;
                                        //是否打印文本
                                        if (dr.Table.Columns.Contains("PrintImageFile"))
                                        {
                                            if (PrintImageFile.ToLower() == "true")
                                            {
                                                isDrawText = true;
                                            }
                                        }
                                        printBarcode(pg, PrintX.ToString(), PrintY.ToString(), PrintWidth.ToString(), PrintHeight.ToString(), pure, BarType, rotate, PrintText, isDrawText, mFont);
                                    }
                                    catch (Exception ex)
                                    {
                                        WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 調用堆棧:" + ex.StackTrace));
                                    }
                                    break;
                                //點
                                case "Point":
                                    if (PrintFlag == "o")
                                    {
                                        pg.FillEllipse(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY - PrintHeight * 3.0 / 2 + 2), PrintWidth * 3, PrintHeight * 3);
                                    }
                                    else if (PrintFlag == "[]")
                                    {
                                        pg.FillRectangle(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY - PrintHeight * 3.0 / 2 + 2), PrintWidth * 3, PrintHeight * 3);
                                    }
                                    else if (PrintFlag == "<>")
                                    {
                                        Point[] points = new Point[4];
                                        points[0] = new Point((int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY));
                                        points[1] = new Point((int)(PrintX), (int)(PrintY + PrintHeight * 3.0 / 2));
                                        points[2] = new Point((int)(PrintX + PrintWidth * 3.0 / 2), (int)(PrintY));
                                        points[3] = new Point((int)(PrintX), (int)(PrintY - PrintHeight * 3.0 / 2));
                                        pg.FillPolygon(mBrush, points);
                                    }
                                    else
                                    {
                                        pg.FillEllipse(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2) * dpi, (int)(PrintY - PrintHeight * 3.0 / 2 + 2) * dpi, PrintWidth * 3 * dpi, PrintHeight * 3 * dpi);
                                    }
                                    break;
                                //多邊形
                                case "Poly":
                                    string[] strArr = PrintText.Split('^');
                                    if (strArr != null && strArr.Length > 2)
                                    {
                                        Point[] polyPoints = new Point[strArr.Length];
                                        int polyPIndex = 0;
                                        foreach (var s in strArr)
                                        {
                                            if (s.Split('@').Length > 1)
                                            {
                                                polyPoints[polyPIndex] = new Point(Convert.ToInt32(Convert.ToDouble(s.Split('@')[0])) * dpi, Convert.ToInt32(Convert.ToDouble(s.Split('@')[1])) * dpi);
                                            }
                                            else
                                            {
                                                polyPoints[polyPIndex] = new Point(0, 0);
                                            }
                                            polyPIndex++;
                                        }
                                        pg.FillPolygon(mBrush, polyPoints);
                                    }
                                    break;
                                //圖片
                                case "Graph":
                                    try
                                    {
                                        //屬性不爲空才進行畫圖
                                        if (!String.IsNullOrEmpty(DataField))
                                        {
                                            WriteLog("打印繪圖:"+DataField);
                                            //打印標識未D認爲是簽名
                                            if (PrintFlag == "D")
                                            {
                                                WriteLog("PrintFlag爲D:打印圖形,DataField應該是Base64串");
                                                ///Base64String 圖形
                                                string graphString = DataField.Replace("data:image/png;base64,", "");
                                                Image img = null;
                                                //圖片串處理成圖片
                                                if (!String.IsNullOrEmpty(graphString))
                                                {
                                                    img = Base64StringToImage(graphString);
                                                }
                                                if (img != null)
                                                {
                                                    WriteLog("執行繪圖");
                                                    Image imgTMP = new Bitmap(img.Width, img.Height);
                                                    Graphics g = Graphics.FromImage(imgTMP);
                                                    g.DrawImage(img, 0, 0, img.Width, img.Height);
                                                    pg.DrawImage(imgTMP, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                                    imgTMP.Dispose();
                                                    img.Dispose();
                                                }
                                                else
                                                {
                                                    WriteLog("還原圖片不成功");
                                                }
                                                img = null;
                                            }
                                            else
                                            {
                                                WriteLog("從FTP下載圖片");
                                                //直接從地址加載圖片
                                                Image img = Image.FromStream(StreamInfo(DataField));
                                                WriteLog("PrintFlag設置:R來反轉圖片背景");
                                                //圖片顏色反轉
                                                if (PrintFlag== "R")
                                                {
                                                    WriteLog("進行圖片反轉");
                                                    Bitmap imgTMP = new Bitmap(img.Width, img.Height);
                                                    Graphics g = Graphics.FromImage(imgTMP);
                                                    g.DrawImage(img, 0, 0, img.Width, img.Height);
                                                    img = GraphUtil.GrayReverse(imgTMP);
                                                }
                                                //下載後畫圖
                                                if (img != null)
                                                {
                                                    WriteLog("執行繪圖");
                                                    pg.DrawImage(img, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                                    img.Dispose();
                                                }
                                                else
                                                {
                                                    WriteLog("FTP流解析圖片失敗");
                                                }
                                                img = null;
                                            }
                                        }
                                        else
                                        {
                                            //文件打印,直接從文件中加載圖片
                                            if (!String.IsNullOrEmpty(PrintImageFile))
                                            {
                                                PrintImageFile = PrintImageFile.Replace("#", "\\");
                                                //文件存在就繪製
                                                if (File.Exists(@PrintImageFile))
                                                {
                                                    Image img = Image.FromFile(PrintImageFile);
                                                    if (img != null)
                                                    {
                                                        pg.DrawImage(img, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
                                                    }
                                                    img.Dispose();
                                                    img = null;
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 調用堆棧:" + ex.StackTrace));
                                    }
                                    break;
                            }
                            if (angle != 0)
                            {
                                //重置繪圖平面的所有變換
                                pg.ResetTransform();
                            }
                        }
                        if (isAutoChangePage == false)
                        {
                            if (pe != null)
                            {
                                if (pintPoints.Count > 0)
                                {
                                    pe.HasMorePages = true;
                                }
                                else
                                {
                                    //繪製完成後,關閉多頁打印功能 
                                    pe.HasMorePages = false;
                                }
                            }
                        }
                        
                    }
                }
            }
            catch (Exception ep)
            {
                WriteLog(String.Format("{0}->{1}", DateTime.Now, ep.Message + " 調用堆棧:" + ep.StackTrace));
            }
            return false;
        }

        /// <summary>
        /// 處理大小控制串
        /// </summary>
        /// <param name="text">文本</param>
        /// <param name="pg">畫筆</param>
        /// <param name="font">字體</param>
        /// <param name="brush">畫刷</param>
        /// <param name="x">x</param>
        /// <param name="y">y</param>
        /// <param name="dpi">縮進率</param>
        /// <param name="format">格式</param>
        private void DrawSizeStr(string text,Graphics pg,Font font,Brush brush,float x,float y,int dpi,StringFormat format)
        {
            string[] strArr = text.Replace("$SIZE$", (char)2 + "").Split((char)2);
            float xnum = 0;
            for(int i=0;i<strArr[0].Length;i++)
            {
                string c=strArr[0].Substring(i,1);
                int size = 5;
                int yNum = 0;
                if (strArr[1].Length > i)
                {
                    size = Convert.ToInt32(strArr[1].Substring(i,1));
                    yNum = size - 5;
                    if (yNum > 0)
                    {
                        yNum += 1;
                    }
                    else if (yNum < 0)
                    {
                        yNum -= 1;
                    }
                }
                //解析得到字體
                Font mFontMi = new Font(font.Name, font.Size - Math.Abs(5 - size)-3, font.Style);
                Font mFontDraw = new Font(font.Name, font.Size - Math.Abs(5 - size), font.Style);
                SizeF sizeMi = pg.MeasureString(c, mFontMi);
                pg.DrawString(c, mFontDraw, brush, xnum + (x) * dpi, (y - yNum) * dpi, format);
                xnum += sizeMi.Width;
            }
        }

        /// <summary>
        /// 是否是整數
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool StrIsInt(string value)
        {
            return Regex.IsMatch(value, @"^[+-]?\d*$");
        }

        /// <summary>
        /// 解析顏色設置
        /// </summary>
        /// <param name="sColor">顏色參數</param>
        /// <returns></returns>
        private static System.Drawing.Brush ResolveColorData(string sColor)
        {
            try
            {
                System.Drawing.Brush returnColor = Brushes.Black;
                if (sColor.Length > 0)
                {
                    returnColor = new SolidBrush(System.Drawing.ColorTranslator.FromHtml(sColor));
                }
                return returnColor;

            }
            catch (Exception)
            {
                return Brushes.Black;
            }
        }

        /// <summary>
        /// 解析字體設置
        /// </summary>
        /// <param name="fntName">字體名稱</param>
        /// <param name="fntSize">字體大小</param>
        /// <param name="fntStyle">樣式</param>
        /// <returns>字體</returns>
        private static Font ResolveFontData(string fntName, float fntSize, string fntStyle)
        {
            try
            {
                Font ReturnFont;
                if (fntName == "") { fntName = "宋體"; }
                if (fntSize <= 0) { fntSize = 10; }

                switch (fntStyle)
                {
                    case "Bold Italic":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Bold | FontStyle.Italic);
                        break;
                    case "Bold, Italic":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Bold | FontStyle.Italic);
                        break;
                    case "Bold":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Bold);
                        break;
                    case "Italic":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Italic);
                        break;
                    case "normal":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
                        break;
                    case "bold":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
                        break;
                    case "bolder":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Bold);
                        break;
                    case "lighter":
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
                        break;
                    default:
                        ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
                        break;
                }
                return ReturnFont;

            }
            catch (Exception)
            {
                return new System.Drawing.Font("Arial", 8, FontStyle.Regular);
            }
        }

        /// <summary>
        /// 打印條碼
        /// </summary>
        /// <param name="g">繪圖句柄</param>
        /// <param name="x">x</param>
        /// <param name="y">y</param>
        /// <param name="width">寬度</param>
        /// <param name="height">高度</param>
        /// <param name="PureBarcode">只條碼</param>
        /// <param name="BarType">條碼類別</param>
        /// <param name="rotate">旋轉角度</param>
        /// <param name="barCode">數據</param>
        /// <param name="isvShow">文本是否垂直顯示</param>
        public void printBarcode(Graphics g, string x, string y, string width, string height, bool PureBarcode, string BarType, string rotate, string barCode, bool isDrawText, Font mFont)
        {
            DrawCode128 code = null;
            if (BarType != "")
            {
                if (BarType.ToUpper() == "A")
                {
                    code = new DrawCode128(barCode, EncCode128.TYPES.A);
                }
                else if (BarType.ToUpper() == "B")
                {
                    code = new DrawCode128(barCode, EncCode128.TYPES.B);
                }
                else if (BarType.ToUpper() == "C")
                {
                    code = new DrawCode128(barCode, EncCode128.TYPES.C);
                }
                else
                {
                    code = new DrawCode128(barCode, EncCode128.TYPES.DYNAMIC);
                }
            }
            else
            {
                code = new DrawCode128(barCode);
            }
            Bitmap map = code.BMPCode128(isDrawText);
            if (rotate != "")
            {
                map.RotateFlip((RotateFlipType)Enum.Parse(typeof(RotateFlipType), rotate));
            }
            //條碼寬度
            int barWidth = Convert.ToInt32(width);
            //設置寬度大於條碼寬度,使用條碼寬度
            //if (barWidth > map.Width)
            //{
                //barWidth = map.Width;
            //}
            //設置的很小取條碼寬度,保證掃描精度
            if (barWidth <= 10)
            {
                barWidth = map.Width;
            }
            g.DrawImage(map, Convert.ToInt32(x) * dpi, Convert.ToInt32(y) * dpi, barWidth * dpi, Convert.ToInt32(height) * dpi);
            if (isDrawText)
            {
                //畫條碼文字
                Brush bush = new SolidBrush(Color.Black);
                Font fontNew = new Font(mFont.Name, mFont.Size-2, mFont.Style);
                Point p = new Point(Convert.ToInt32(x) * dpi, Convert.ToInt32(y) * dpi + Convert.ToInt32(height) * dpi);
                g.DrawString(barCode, fontNew, bush, p);
            }
        }

        /// <summary>
        /// 寫日誌
        /// </summary>
        /// <param name="log"></param>
        private static void WriteLog(string log)
        {
            LIS.Core.Util.LogUtils.WriteDebugLog(log);
        }


        /// <summary>
        /// 圖片轉爲base64編碼的文本
        /// </summary>
        /// <param name="bmp">圖片</param>
        /// <returns></returns>
        private static string ImgToBase64String(Bitmap bmp)
        {
            string strbaser64 = "";
            try
            {
                MemoryStream ms = new MemoryStream();
                bmp.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();
                strbaser64 = Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                WriteLog("圖片轉換Base64String 轉換失敗\n異常:" + ex.Message + " 調用堆棧:" + ex.StackTrace);
            }
            return strbaser64;
        }


        /// <summary>
        /// base64編碼的文本轉爲圖片
        /// </summary>
        /// <param name="inputStr">輸入串</param>
        /// <returns>結果</returns>
        private static Image Base64StringToImage(string inputStr)
        {
            Bitmap bmp = null;
            try
            {
                byte[] arr = Convert.FromBase64String(inputStr);
                MemoryStream ms = new MemoryStream(arr);
                bmp = new Bitmap(ms);
                ms.Dispose();
                ms.Close();
                
            }
            catch (Exception ex)
            {
                WriteLog("Base64String到圖片轉換失敗\n異常:" + ex.Message + " 調用堆棧:" + ex.StackTrace);
            }
            return bmp;
        }

        /// <summary>
        /// 比特轉圖片
        /// </summary>
        /// <param name="imgByte">圖片比特</param>
        /// <returns>圖片</returns>
        private static Image ByteArrayToImage(byte[] imgByte)
        {
            Image img = null;
            try
            {
                MemoryStream ms = new MemoryStream(imgByte);
                img = Image.FromStream(ms);
                ms.Close();
            }
            catch
            {
                img = null;
            }
            return img;
        }

        /// <summary>
        /// 獲得ftp流
        /// </summary>
        /// <param name="ftpUrlfileName">ftp文件名</param>
        /// <returns></returns>
        public Stream StreamInfo(string ftpUrlfileName)
        {
            try
            {
                FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpUrlfileName));
                reqFtp.UseBinary = true;
                FtpWebResponse respFtp = (FtpWebResponse)reqFtp.GetResponse();
                Stream stream = respFtp.GetResponseStream();
                return stream;
            }
            catch (Exception ex)
            {
                WriteLog(String.Format("從ftp加載圖片錯誤{0}->{1}", DateTime.Now, ex.Message + " 調用堆棧:" + ex.StackTrace));
                throw;
            }
        }

    }
}

C#實現的調用通道實現(M通過webservice調入該對象)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
using Newtonsoft.Json;
using System.Net;
namespace LIS.Mach.ImageDeal
{
    ///<summary  NoteObject="Class">
    /// [功能描述:檢驗繪圖處理基礎,按約定的元素據進行繪圖] <para/>
    /// [創建者:zlz] <para/>
    /// [創建時間:2019年10月12日] <para/>
    ///<說明>
    ///  [說明:[功能描述:檢驗繪圖處理基礎,按約定的元素據進行繪圖]<para/>
    ///</說明>
    ///<修改記錄>
    ///    [修改時間:本次修改時間]<para/>
    ///    [修改內容:本次修改內容]<para/>
    ///</修改記錄>
    ///<修改記錄>
    ///    [修改時間:本次修改時間]<para/>
    ///    [修改內容:本次修改內容]<para/>
    ///    M端觸發代碼,其他的和監聽程序一樣
    ///    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDrawImageAsyncHandlerSoap).%New()
    ///    s ret=retObj.DrawImage(epis,ystr,mi,"MI.MIFV8","-1","","LIS.Mach.ImageDeal.ImageDealV8,LIS.Mach.ImageDeal")
    ///</修改記錄>
    ///</summary>
    public class ImageDealBase : BaseDeal, IDealCharStream
    {
        /// <summary>
        /// 索引
        /// </summary>
        private static int index = 0;

        // <summary>
        /// 處理字符流接口方法
        /// </summary>
        /// <param name="charStream">字符流,M傳入類型%GlobalCharacterStream</param>
        /// <param name="otherPara">其他參數</param>
        /// <param name="dealProcess">處理M</param>
        /// <param name="dealClass">C#處理類格式:類全名,不帶後綴的動態庫名</param>
        /// <returns></returns>
        public string DealStream(string charStream, string otherPara, string dealProcess, string dealClass)
        {
            string retStr = "";
            //其他參數分割
            string[] otherParaArr = otherPara.Split('#');
            string retType = otherParaArr[0];
            Image img = null;
            //刪除兩天前老文件
            GraphUtil.DeleteOldFile(@"C:\TRAK\TmpMach",2);
            if (retType.Contains("-GETFTP"))
            {
                retType = retType.Split('-')[0];
                Stream ftpStream = null;
                FtpWebRequest reqFTP;
                try
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(charStream));
                    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                    reqFTP.UseBinary = true;
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    ftpStream = response.GetResponseStream();
                    img = Image.FromStream(ftpStream);
                    ftpStream.Close();
                    response.Close();
                }
                catch (Exception ex)
                {
                    LIS.Core.Util.LogUtils.WriteExceptionLog("繪圖基礎下載ftp文件失敗!", ex);
                }
                finally
                {
                    if (ftpStream != null)
                    {
                        ftpStream.Dispose();
                    }
                }
            }
            else if (retType.Contains("-BASE64GETIMAGE"))
            {
                retType = retType.Split('-')[0];
                try
                {
                    byte[] arr = Convert.FromBase64String(charStream);
                    MemoryStream ms = new MemoryStream(arr);
                    img = new Bitmap(ms);
                    ms.Dispose();
                    ms.Close();
                    Bitmap imgTMP = new Bitmap(img.Width, img.Height);
                    Graphics g = Graphics.FromImage(imgTMP);
                    g.DrawImage(img, 0, 0, img.Width, img.Height);
                    img.Dispose();
                    img = imgTMP;
                    
                }
                catch (Exception ex)
                {
                    LIS.Core.Util.LogUtils.WriteExceptionLog("繪圖基礎Base64String到圖片轉換失敗\n異常:", ex);
                }
            }
            //通過Base64串得到文件
            else if (retType.Contains("-BASE64GETFILE"))
            {
                byte[] arr = Convert.FromBase64String(charStream);
                //判斷C盤trak是否存在
                string tmpPath = @"C:\TRAK\TmpMach";
                if (!Directory.Exists("C:\\TRAK"))
                {
                    //新建文件夾
                    Directory.CreateDirectory("C:\\TRAK");
                }
                if (!Directory.Exists(tmpPath))
                {
                    //新建文件夾   
                    Directory.CreateDirectory(tmpPath);
                }
                string fileName = otherParaArr[1];
                string ftpName = otherParaArr[2];
                string localPath = tmpPath + "\\" + fileName;
                File.WriteAllBytes(localPath, arr);
                if (File.Exists(localPath))
                {
                    string ftpPath = "";
                    FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
                    //上傳圖片
                    ftp.Upload(localPath, fileName);
                    File.Delete(localPath);
                    retStr = ftpPath.Split('^')[3] + fileName;
                }
                return retStr;
            }
            //通過比特串得到文件
            else if (retType.Contains("-BITGETFILE"))
            {
                byte[] arr = System.Text.Encoding.UTF8.GetBytes(charStream);
                //判斷C盤trak是否存在
                string tmpPath = @"C:\TRAK\TmpMach";
                if (!Directory.Exists("C:\\TRAK"))
                {
                    //新建文件夾
                    Directory.CreateDirectory("C:\\TRAK");
                }
                if (!Directory.Exists(tmpPath))
                {
                    //新建文件夾   
                    Directory.CreateDirectory(tmpPath);
                }
                string fileName = otherParaArr[1];
                string ftpName = otherParaArr[2];
                string localPath = tmpPath + "\\" + fileName;
                File.WriteAllBytes(localPath, arr);
                if (File.Exists(localPath))
                {
                    string ftpPath = "";
                    FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
                    //上傳圖片
                    ftp.Upload(localPath, fileName);
                    File.Delete(localPath);
                    retStr = ftpPath.Split('^')[3] + fileName;
                }
                return retStr;
            }
            else
            {
                DataTable drawDT = null;
                //按json數組數據畫圖
                if (charStream.Length > 20 && charStream.Contains("["))
                {
                    drawDT = JsonConvert.DeserializeObject<DataTable>(charStream);
                }
                else
                {
                    //參數
                    LIS.Model.Bussiness.Parameters param = new LIS.Model.Bussiness.Parameters();
                    //調用類名
                    string ClassName = dealProcess;
                    //調用方法名
                    string FuncName = "QryDrawElement";
                    //按id取繪圖數據
                    param.P0 = charStream;
                    //登錄信息
                    string logInfo = "";
                    string errStr;
                    try
                    {
                        //調用方法
                        drawDT = LIS.DAL.DataAccess.WebManager.GetDataTable(ClassName, FuncName, param, logInfo, out errStr);
                    }
                    catch (Exception ex)
                    {
                        LIS.Core.Util.LogUtils.WriteExceptionLog("繪圖基礎查詢繪圖數據異常", ex);
                    }
                }
                DrawElementBase draw = new DrawElementBase();
                img = draw.DrawService(drawDT);
            }
            //有圖就上傳ftp
            if (img != null)
            {
                try
                {
                    //判斷C盤trak是否存在
                    string tmpPath = @"C:\TRAK\TmpMach";
                    if (!Directory.Exists("C:\\TRAK"))
                    {
                        //新建文件夾
                        Directory.CreateDirectory("C:\\TRAK");
                    }
                    if (!Directory.Exists(tmpPath))
                    {
                        //新建文件夾   
                        Directory.CreateDirectory(tmpPath);
                    }
                    string fileName = otherParaArr[1];
                    string ftpName = otherParaArr[2];
                    //返回Base64位串
                    if (retType.ToUpper() == "BASE64")
                    {
                        retStr = ImgToBase64String(img);
                    }
                    else
                    {
                        if (!fileName.Contains(".bmp"))
                        {
                            fileName += ".bmp";
                        }
                        string localPath = tmpPath + "\\LIS" + index+"-"+fileName;
                        index++;
                        index = index % 9999;
                        img.Save(localPath);
                        if (File.Exists(localPath))
                        {
                            string ftpPath = "";
                            FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
                            //上傳圖片
                            ftp.Upload(localPath, fileName);
                            File.Delete(localPath);
                            retStr = ftpPath.Split('^')[3] + fileName;
                        }
                    }
                }
                catch(Exception ex)
                {
                    return "-1^" + ex.Message;
                }
                finally
                {
                    img.Dispose();
                }
            }
            return retStr;
        }

        /// <summary>
        /// 圖片轉爲base64編碼的文本
        /// </summary>
        /// <param name="bmp">圖片</param>
        /// <returns></returns>
        private static string ImgToBase64String(Image bmp)
        {
            string strbaser64 = "";
            try
            {
                MemoryStream ms = new MemoryStream();
                bmp.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();
                strbaser64 = Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return "-1^" + ex.Message;
            }
            return strbaser64;
        }

    }
}

LIS繪圖代理類

/// 名稱: 檢驗圖片類,做爲檢驗繪圖基礎類(有問題反饋,不要私下調整)  
/// 描述: 實現繪圖支持,提供基礎畫筆代理
/// 代碼示例
/// s imgObj=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).%New()
/// //畫直方圖邏輯
/// //s ret=imgObj.GetHistogram("","Histogram.bmp","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方圖","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
/// //畫文本
/// s ret=imgObj.DrawLabel(10,10,"測試文本")
/// s ret=imgObj.DrawLabel(40,40,"畫文本")
/// //選中的複選框
/// s ret=imgObj.DrawCheckBox(60,60,"1")
/// //沒選中的複選框
/// s ret=imgObj.DrawCheckBox(90,60,"0")
/// //畫線
/// s ret=imgObj.DrawLine(150,0,150,300,2)
/// s ret=imgObj.DrawLine(0,150,300,150,1,1,"red")
/// //畫條碼
/// s ret=imgObj.DrawBarCode(140,40,"1035891934")
/// //畫點
/// s ret=imgObj.DrawPoint(140,90,4,4)
/// s ret=imgObj.DrawPoint(180,90,4,4,"[]","red")
/// //畫多邊形
/// s ret=imgObj.DrawPoly("100@100^290@200^150@150","red")
/// //畫指定ftp地址圖片到圖形上
/// s ret=imgObj.DrawGraph(200,200,100,100,"ftp://lis:[email protected]/MCImage/19-0.jpg")
/// //保存圖形
/// s ret=imgObj.Save(300,300,"","0947809.bmp","ZLZ","")
/// //s ret=imgObj.Save(300,300,"BASE64","0947809.bmp","ZLZ","")
/// //保存圖片路徑到儀器
/// s ret=imgObj.SaveToMachine(ret,16,"999","P")
/// //從FTP地址獲取圖片。如:西門子2120的圖在ftp上獲取
/// s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD("ftp://lis:[email protected]/MCImage/19-0.jpg","","zlz.bmp","zlz")
/// //給傳入的Base64串處理成圖片到FTP。 如:買入BC5800
/// s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetImgByBase64MTHD("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","","zlzbase64.bmp","zlz")
/// //Base64字符流的參數方法
/// s charStream=##class(%GlobalCharacterStream).%New()
/// d charStream.Write("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")
/// s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetImgByBase64StreamMTHD(charStream,"","zlzbase64.bmp","zlz")
/// //通過base64串得到文件
/// s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBase64StreamMTHD(charStream,"zlzbase64file.bmp","zlz")
/// //通過比特串得到文件
/// s charStreamBit=##class(%GlobalCharacterStream).%New()
/// d charStreamBit.Write("")
/// s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBitStreamMTHD(charStreamBit,"zlzbase64file.bmp","zlz")
/// q ret
/// 編寫者:zlz
/// 編寫日期:20191012
/// 
Class wbsLisMsgAsyncHandler.LISMsg.DHCLISImage Extends %RegisteredObject
{

/// 圖片句柄
Property ImgHander As %String;

/// 當前繪圖索引
Property CurIndex As %Integer;

/// 當前天
Property CurDay As %Integer;

/// 畫標籤
/// x:x座標(*必填)
/// y:y座標(*必填)
/// drawStr:要繪製的文本(*必填)
/// font:字體
/// fontSize:字體大小
/// fontStyle:字體樣式
/// alignment:字體靠齊方向  Center:居中  Right:靠右  Justified或者空:靠左
/// color:顏色,html顏色 red  #ffffff這種
/// angle:旋轉角度,角度數字
Method DrawLabel(x, y, drawStr, font, fontSize, fontStyle, alignment, color, angle)
{
	s x=$g(x)
	s y=$g(y)
	s drawStr=$g(drawStr)
	s font=$g(font)
	s fontSize=$g(fontSize)
	s fontStyle=$g(fontStyle)
	s alignment=$g(alignment)
	s color=$g(color)
	s angle=$g(angle)
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Label"
	s PrintX=x
	s PrintY=y
	s PrintFont=font
	s PrintFontSize=fontSize
	s PrintFontStyle=fontStyle
	s PrintText=drawStr
	s PrintAlignment=alignment
	s PrintColor=color
	s Angle=angle
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

/// 畫複選框
/// x:x座標(*必填)
/// y:y座標(*必填)
/// checked:是否選擇  0:不選,1:選中
/// width:寬度
/// height:高度
Method DrawCheckBox(x, y, checked, width, height)
{
	s x=$g(x)
	s y=$g(y)
	s checked=$g(checked)
	s width=$g(width)
	s height=$g(height)
	i checked="1" s checked="是"
	i checked="0" s checked=""
	i '$l(width) s width=20
	i '$l(height) s height=20
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="CheckBox"
	s PrintX=x
	s PrintY=y
	s PrintText=checked
	s PrintWidth=width
	s PrintHeight=height
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫單選框

// x:x座標(*必填)

// y:y座標(*必填)

// checked:是否選擇 0:不選,1:選中

// width:寬度

// height:高度

Method DrawRadio(x, y, checked, width, height)
{
	s x=$g(x)
	s y=$g(y)
	s checked=$g(checked)
	s width=$g(width)
	s height=$g(height)
	i checked="1" s checked="是"
	i checked="0" s checked=""
	i '$l(width) s width=20
	i '$l(height) s height=20
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Radio"
	s PrintX=x
	s PrintY=y
	s PrintText=checked
	s PrintWidth=width
	s PrintHeight=height
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫線

// x:起點x座標(*必填)

// y:起點y座標(*必填)

// x1:終點x座標(*必填)

// y1:終點y座標(*必填)

// size:線寬度 默認1

// dashStyle:線樣式,0、1、2、3、4

// color:顏色 html顏色 red  #ffffff這種

Method DrawLine(x, y, x1, y1, size, dashStyle, color)
{
	s x=$g(x)
	s y=$g(y)
	s x1=$g(x1)
	s y1=$g(y1)
	s size=$g(size)
	s dashStyle=$g(dashStyle)
	s color=$g(color)
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i $l(dashStyle),(dashStyle'=0),(dashStyle'=1),(dashStyle'=2),(dashStyle'=3),(dashStyle'=4) s dashStyle=""
	i '$l(size) s size=1
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="ILineN"
	s PrintX=x
	s PrintY=y
	s PrintWidth=x1
	s PrintHeight=y1
	s PrintLength=size
	s PrintFlag=dashStyle
	s PrintColor=color
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫條碼

// x:x座標(*必填)

// y:y座標(*必填)

// drawStr:要繪製的文本(*必填)

// isDrawText:是否繪製條碼文本 0:不畫條碼文本  1:畫條碼文本

// width:寬度 小於10認爲使用條碼本身寬度不做縮放

// height:高度

// barType:條碼碼制,空默認,可爲A、B、C

// font:字體

// fontSize:字體大小

// fontStyle:字體樣式

// alignment:字體靠齊方向  Center:居中  Right:靠右  Justified或者空:靠左

// color:顏色,html顏色 red  #ffffff這種

// angle:旋轉角度,角度數字

Method DrawBarCode(x, y, barStr, isDrawText, width, height, barType, font, fontSize, fontStyle, alignment, color, angle)
{
	s x=$g(x)
	s y=$g(y)
	s barStr=$g(barStr)
	s isDrawText=$g(isDrawText)
	s width=$g(width)
	s height=$g(height)
	s barType=$g(barType)
	s font=$g(font)
	s fontSize=$g(fontSize)
	s fontStyle=$g(fontStyle)
	s alignment=$g(alignment)
	s color=$g(color)
	s angle=$g(angle)
	i '$l(width) s width=5
	i '$l(height) s height=20
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Data"
	s PrintX=x
	s PrintY=y
	s PrintFont=font
	s PrintFontSize=fontSize
	s PrintFontStyle=fontStyle
	s PrintText=barStr
	s PrintWidth=width
	s PrintHeight=height
	s PrintAlignment=alignment
	s PrintColor=color
	s Angle=angle
	s Flag=""
	i isDrawText=0 s Flag="N"
	s PrintFlag="BarCode"_Flag_barType
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫點

// x:x座標(*必填)

// y:y座標(*必填)

// width:寬度

// height:高度

// type:點類型o  []  <>或者空串

// color:顏色,html顏色 red  #ffffff這種

Method DrawPoint(x, y, width, height, type, color)
{
	s x=$g(x)
	s y=$g(y)
	s width=$g(width)
	s height=$g(height)
	s type=$g(type)
	s color=$g(color)
	
	i '$l(width) s width=2
	i '$l(height) s height=2
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i $l(type),(type'="o"),(type'="[]"),(type'="<>") s type=""
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Point"
	s PrintX=x
	s PrintY=y
	s PrintWidth=width
	s PrintHeight=height
	s PrintFlag=type
	s PrintColor=color
	
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫多邊形

// points:點集合描述串多個點用^分割,一個點的xy用@分割  如:10@10^29@20^100@15(*必填)

// color:顏色,html顏色 red  #ffffff這種

Method DrawPoly(points, color)
{
	s points=$g(points)
	s color=$g(color)
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Poly"
	s PrintText=points
	s PrintColor=color
	
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

// 畫圖片

// x:x座標(*必填)

// y:y座標(*必填)

// width:寬度(*必填)

// height:高度(*必填)

// dataField:數據,簽名圖片就傳base64位串,否則傳ftp全路徑地址(*必填)

// isSign:是否是簽名圖片 默認不是

Method DrawGraph(x, y, width, height, dataField, isSign)
{
	s x=$g(x)
	s y=$g(y)
	s width=$g(width)
	s height=$g(height)
	s dataField=$g(dataField)
	s isSign=$g(isSign)
	
	i ..CurIndex>10000 q "-1^畫元素太多,檢測可能的死循環"
	
	i '$l(width) s width=80
	i '$l(height) s height=80
	
	i '$l(..CurDay) s ..CurDay=$p($h,",",1)
	i '$l(..ImgHander) d
	.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
	.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
	i '$l(..CurIndex) s ..CurIndex=1
	
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
	s PrintType="Graph"
	s PrintX=x
	s PrintY=y
	s PrintWidth=width
	s PrintHeight=height
	s DataField=dataField
	i isSign="1"  s PrintFlag="D"
	
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
	s ..CurIndex=..CurIndex+1
	q ""
}

/// 執行繪圖
/// imgWidth:圖片寬度(*必填)
/// imgHeight:圖片高度(*必填)
/// retType:反回類型,可爲BASE64或空
/// fileName:返回類型不是BASE64串時指定的上傳ftp的文件名(*返回類型不是BASE64時必填)
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名(*返回類型不是BASE64時必填)
Method Save(imgWidth As %String, imgHeight As %String, retType As %String, fileName As %String, ftpFfolderName As %String, bkColor As %String)
{
	s imgWidth=$g(imgWidth)
	s imgHeight=$g(imgHeight)
	s retType=$g(retType)
	s fileName=$g(fileName)
	s ftpFfolderName=$g(ftpFfolderName)
	s bkColor=$g(bkColor)
	s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
	s PrintType="ImageInfo"
	s PrintWidth=imgWidth
	s PrintHeight=imgHeight
	s PrintColor=bkColor
	s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,0)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
    s retType=$g(retType)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.bmp"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara=retType_"#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s charStream=##class(%GlobalCharacterStream).%New()
    d charStream.Write(..ImgHander)
    s ret=retObj.DealStream(charStream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	//刪除數據
	k ^LISImageElement("LISDrawBase",..ImgHander)
	q ret
}

/// 保存圖片到儀器
/// fileName:保存圖片返回的ftp相對路徑名(*必填)
/// mi:儀器主鍵(*必填)
/// epis:流水號(*必填)
/// ImageClass:圖片類別(*必填)
Method SaveToMachine(fileName As %String, mi As %String, epis As %String, ImageClass As %String) As %String
{
	s mi=$g(mi)
	s epis=$g(epis)
	s ImageClass=$g(ImageClass)
	s fileName=$g(fileName)
	i fileName["-1^" d Trace^MI.MIF000(mi,"路徑:"_fileName_"不正常","H<--M")
	i fileName["-1^" q "-1^可能的非法路徑"
	i $l(fileName)>300 q "-1^可能的非法路徑"
	s ret="1"
  	i '$d(^dbo.BTMIMachineParameterD(mi)) q "-1^儀器不存在"
 	d Trace^MI.MIF000(mi,epis_":"_ImageClass_":"_fileName,"H<--M")
 	s (ReceiveDate, ImageOrder, Caption, DisplayRatio, Height, Width, Sequence)=""
	s ret=##Class(MI.Common.MachineResult).SaveImage(ReceiveDate, epis, ImageClass, ImageOrder, fileName, mi, Caption, DisplayRatio, Height, Width, Sequence)
	q ret
}

/// 得到直方圖(有bug和需求公共修復)
/// retType:反回類型,可爲BASE64或空
/// fileName:返回類型不是BASE64串時指定的上傳ftp的文件名(*返回類型不是BASE64時必填)
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名(*返回類型不是BASE64時必填)
/// imgWidth:圖片寬度(*必填)
/// imgHeight:圖片高度(*必填)
/// values:結果值,多個以逗號分隔(*必填)
/// lable:左上角的標題文本
/// title:上面中間的標題文本
/// xShow:x座標顯示的字符  格式:x的位置#顯示的文本 如:5#5,10#10,15#15,20#20,24#pL
/// yShow:y座標顯示的字符  格式:y的位置#顯示的文本 如:0#0,15#15,30#30,45#45,60#60,75#mol/L
/// s ret=imgObj.GetHistogram("","Histogram.bmp","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方圖","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
Method GetHistogram(retType As %String, fileName As %String, ftpFfolderName As %String, imgWidth As %String, imgHeight As %String, values As %String, lable As %String, title As %String, xShow As %String, yShow As %String) As %String
{
	s retType=$g(retType)
	s fileName=$g(fileName)
	s ftpFfolderName=$g(ftpFfolderName)
	s imgWidth=$g(imgWidth)
	s imgHeight=$g(imgHeight)
	s values=$g(values)
	s lable=$g(lable)
	s title=$g(title)
	s xShow=$g(xShow)
	s yShow=$g(yShow)
	
	s xPianYi=40
	s yPianYi=40
	//最大值
	s maxVal=0
	//最大點數
	s pointNum=0
	
	//找y軸的最大值
	i $l(yShow) d
	.f j=1:1:$l(yShow,",") d
	..s OneYShow=$p(yShow,",",j)
	..i '$l(OneYShow) q
	..s yNum=$p(OneYShow,"#",1)
	..s yStr=$p(OneYShow,"#",2)
	..i '$l(yNum) q
	..i '$l(yStr) q
	..i yNum>maxVal s maxVal=yNum
	
	//找結果的最大值
	f i=1:1:$l(values,",") d
	.s val=$p(values,",",i)
	.i '$l(val) q
	.i '$ISVALIDNUM(val) q
	.s pointNum=pointNum+1
	.i val>maxVal s maxVal=val
	
	//找x的最大值
	i $l(xShow) d
	.f j=1:1:$l(xShow,",") d
	..s OneXShow=$p(xShow,",",j)
	..i '$l(OneXShow) q
	..s xNum=$p(OneXShow,"#",1)
	..s xStr=$p(OneXShow,"#",2)
	..i '$l(xNum) q
	..i '$l(xStr) q
	..i xNum>pointNum s pointNum=xNum
	
	s xXiShu=(imgWidth-10)/pointNum
	s yXiShu=(imgHeight-20)/maxVal
	
	//畫縱座標
	s retDraw=..DrawLine(xPianYi,imgHeight,xPianYi,5,1,"","")
	//畫左上角名稱
	i $l(lable) s retDraw=..DrawLabel(xPianYi,10,lable,"","","","Right")
	//畫x座標要顯示的東西
	i $l(yShow) d
	.f j=1:1:$l(yShow,",") d
	..s OneYShow=$p(yShow,",",j)
	..i '$l(OneYShow) q
	..s yNum=$p(OneYShow,"#",1)
	..s yStr=$p(OneYShow,"#",2)
	..i '$l(yNum) q
	..i '$l(yStr) q
	..s curY=(imgHeight-(yXiShu*yNum))
	..//換x座標軸的文字
	..s retDraw=..DrawLabel(xPianYi,curY,yStr,"","","","Right")
	..s retDraw=..DrawLine(xPianYi-1,curY,xPianYi+1,curY,1,"","")
	
	//畫橫座標
	s retDraw=..DrawLine(xPianYi,imgHeight,xPianYi+imgWidth-5,imgHeight,1,"","")
	//畫頂部中間的標題
	i $l(title) s retDraw=..DrawLabel(xPianYi+imgWidth/2,10,title,"","","","Center")
	//畫x座標要顯示的東西
	i $l(xShow) d
	.f j=1:1:$l(xShow,",") d
	..s OneXShow=$p(xShow,",",j)
	..i '$l(OneXShow) q
	..s xNum=$p(OneXShow,"#",1)
	..s xStr=$p(OneXShow,"#",2)
	..i '$l(xNum) q
	..i '$l(xStr) q
	..s curX=xPianYi+(xNum*xXiShu)
	..//換x座標軸的文字
	..s retDraw=..DrawLabel(curX,imgHeight+10,xStr,"","","","Center")
	..s retDraw=..DrawLine(curX,imgHeight+1,curX,imgHeight-1,1,"","")
	
	//畫連線
	s preX=""
	s preY=""
	
	s pointNum=0
	f i=1:1:$l(values,",") d
	.s val=$p(values,",",i)
	.i '$l(val) q
	.i '$ISVALIDNUM(val) q
	.s pointNum=pointNum+1
	.s curX=xPianYi+(pointNum*xXiShu)
	.s curY=(imgHeight-(yXiShu*val))
	.s curX=$fn(curX,"",0)
	.s curY=$fn(curY,"",0)
	.i $l(preX) d
	..s retDraw=..DrawLine(preX,preY,curX,curY,1,"","")
	.s preX=curX
	.s preY=curY
	s ret=..Save(imgWidth+xPianYi,imgHeight+yPianYi,retType,fileName,ftpFfolderName,"")
	q ret
}

/// 從FTP地址獲取圖片。如:西門子2120的圖在ftp上獲取,把目標ftp的圖片轉到儀器目錄下或者得到BASE64串
/// originFTP:源圖的FTP全地址,帶密碼
/// retType:反回類型,可爲BASE64或空
/// fileName:返回類型不是BASE64串時指定的上傳ftp的文件名
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名
/// w ##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD("ftp://lis:[email protected]/MCImage/19-0.jpg","","zlz.bmp","zlz")
ClassMethod GetFTPImgMTHD(originFTP As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s originFTP=$g(originFTP)
	s retType=$g(retType)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.bmp"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara=retType_"-GETFTP#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s charStream=##class(%GlobalCharacterStream).%New()
    d charStream.Write(originFTP)
    s ret=retObj.DealStream(charStream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	q ret
}

/// 通過BASE64位串獲取圖片。如:邁瑞BC5800的散點圖,把儀器圖片串轉到儀器目錄下或者得到BASE64串
/// base64Str:圖片的base64串
/// retType:反回類型,可爲BASE64或空
/// fileName:返回類型不是BASE64串時指定的上傳ftp的文件名
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名
/// w ##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD("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","","zlz.bmp","zlz")
ClassMethod GetImgByBase64MTHD(base64Str As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s base64Str=$g(base64Str)
	s retType=$g(retType)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.bmp"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara=retType_"-BASE64GETIMAGE#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s charStream=##class(%GlobalCharacterStream).%New()
    d charStream.Write(base64Str)
    s ret=retObj.DealStream(charStream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	q ret
}

/// 通過BASE64位串獲取圖片。如:邁瑞BC5800的散點圖,把儀器圖片串轉到儀器目錄下或者得到BASE64串
/// base64Str:圖片的base64的字符流
/// retType:反回類型,可爲BASE64或空
/// fileName:返回類型不是BASE64串時指定的上傳ftp的文件名
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名
/// w ##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD(base64串格式的字符流,"","zlz.bmp","zlz")
ClassMethod GetImgByBase64StreamMTHD(base64Stream As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s base64Stream=$g(base64Stream)
	s retType=$g(retType)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.bmp"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara=retType_"-BASE64GETIMAGE#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s ret=retObj.DealStream(base64Stream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	q ret
}

/// 通過BASE64位串獲取文件。如:邁瑞BC5800的散點圖,把儀器圖片串轉到儀器目錄下或者得到BASE64串
/// base64Str:文件的base64的字符流
/// fileName:指定的上傳ftp的文件名稱,帶後綴
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名
/// w ##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBase64StreamMTHD(base64串格式的字符流,"","zlz.bmp","zlz")
ClassMethod GetFileByBase64StreamMTHD(base64Stream As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s base64Stream=$g(base64Stream)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.lis"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara="FILE-BASE64GETFILE#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s ret=retObj.DealStream(base64Stream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	q ret
}

/// 通過BASE64位串獲取文件。如:邁瑞BC5800的散點圖,把儀器圖片串轉到儀器目錄下或者得到BASE64串
/// bitStream:文件的比特的字符流
/// fileName:指定的上傳ftp的文件名稱,帶後綴
/// ftpFfolderName:返回類型不是BASE64串時指定的上傳ftp的文件夾目錄名
/// w ##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD(比特串格式的字符流,"","zlz.bmp","zlz")
ClassMethod GetFileByBitStreamMTHD(bitStream As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s bitStream=$g(bitStream)
    s fileName=$g(fileName)
    s ftpFfolderName=$g(ftpFfolderName)
    i '$l(fileName) s fileName="unknown.lis"
    i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
    s otherPara="FILE-BITGETFILE#"_fileName_"#"_ftpFfolderName
    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
    s ret=retObj.DealStream(bitStream,otherPara,"wbsLisMsgAsyncHandler.LISMsg.DHCLISImage","LIS.Mach.ImageDeal.ImageDealBase,LIS.Mach.ImageDeal")
	q ret
}

/// Creator:      查詢繪圖元素數據
/// CreatDate:    20191012
/// Description:  查詢繪圖元素數據
/// Table:        
/// Input:        
/// Output:       
/// Return:       
/// Others:       
Query QryDrawElement(imgHander As %String, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %Query(ROWSPEC = "PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle")
{
}

/// Query的執行方法
/// d ##class(%ResultSet).RunQuery("LIS.WS.BLL.DHCQCLeaveRules","QryMachineTestCodeLeave","32","668","2018-09-01","2018-09-30","60116","")
ClassMethod QryDrawElementExecute(ByRef qHandle As %Binary, imgHander As %String, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %Status
{
	//得到入參醫院編碼
    s imgHander=$g(imgHander)

 	Set repid=$I(^CacheTemp)
	If $Get(ind)="" Set ind=1
	
	//沒有圖片句柄退出,退出
	i '$l(imgHander) q $$$OK
	s CurDay="" f  s CurDay=$o(^LISImageElement("LISDrawBase",CurDay)) q:CurDay=""  d
	.//刪除兩天前的數據
	.i ($p($h,",",1)-CurDay)>2 k ^LISImageElement("LISDrawBase",CurDay) q
	.i $d(^LISImageElement("LISDrawBase",CurDay,imgHander)) d
	..s index="" f  s index=$o(^LISImageElement("LISDrawBase",CurDay,imgHander,index)) q:index=""  d
	...s Data=^LISImageElement("LISDrawBase",CurDay,imgHander,index)
	...d Output
	.k ^LISImageElement("LISDrawBase",CurDay,imgHander)
 	Set qHandle=$lb(0,repid,0)
	Quit $$$OK
	
	
Output
 	Set ColFields ="PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle"
 	Set ^CacheTemp(repid,ind)=##Class(LIS.Util.Common).TransListNull(Data,ColFields)
 	Set ind=ind+1
	quit
}

ClassMethod QryDrawElementClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = QryDrawElementExecute ]
{
	Set repid=$LIST(qHandle,2)
 	Kill ^CacheTemp(repid)
	Quit $$$OK
}

ClassMethod QryDrawElementFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = QryDrawElementExecute ]
{
 	Set AtEnd=$LIST(qHandle,1)
 	Set repid=$LIST(qHandle,2)
 	Set ind=$LIST(qHandle,3)
 	Set ind=$o(^CacheTemp(repid,ind))
 	If ind="" {	
 		Set AtEnd=1
 		Set Row=""
 	}
 	Else      {	
 		Set Row=^CacheTemp(repid,ind)
 	}
 	// Save QHandle
 	s qHandle=$lb(AtEnd,repid,ind)
	Quit $$$OK
}

// w ##class(wbsLisMsgAsyncHandler.LISMsg.DHCDrawBase).GetFtpMTHD("Sebia")

// 文件夾目錄名稱

ClassMethod GetFtpMTHD(directName, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
    s directName=$g(directName)
  	s FtpData=##class(OTH.SYSParameter).GetDataValue("LABReportImageFTP","HOS","1")
  	s Ftp=$p(FtpData,"@",2)
  	s User=$p($p($p(FtpData,"@",1),":",2),"/",3)
  	s Password=$p($p(FtpData,"@",1),":",3)
  	s FilePath="/"_directName_"/"_$tr($zd($h,3),"-")_"/"
  	q Ftp_"^"_User_"^"_Password_"^"_FilePath
}

}

測試代碼

s imgObj=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).%New()
	//得到直方圖
	s ret=imgObj.GetHistogram("","Histogram.bmp","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方圖","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
	//文本
    s ret=imgObj.DrawLabel(10,10,"測試文本")
    s ret=imgObj.DrawLabel(40,40,"畫文本")
    //選中的複選框
    s ret=imgObj.DrawCheckBox(60,60,"1")
    //沒選中的複選框
    s ret=imgObj.DrawCheckBox(90,60,"0")
    //線
    s ret=imgObj.DrawLine(150,0,150,300,2)
    s ret=imgObj.DrawLine(0,150,300,150,1,1,"red")
    //條碼
    s ret=imgObj.DrawBarCode(140,40,"1035891934")
    //點
    s ret=imgObj.DrawPoint(140,90,4,4)
    s ret=imgObj.DrawPoint(180,90,4,4,"[]","red")
    //多邊形
    s ret=imgObj.DrawPoly("100@100^290@200^150@150","red")
    //畫圖
    s ret=imgObj.DrawGraph(200,200,100,100,"ftp://lis:[email protected]/MCImage/19-0.jpg")
    set ret=imgObj.Save(300,300,"","0947809.bmp","ZLZ","")
    set ret=imgObj.Save(300,300,"BASE64","0947809.bmp","ZLZ","")
    //保存圖片路徑到儀器
    s ret=imgObj.SaveToMachine(ret,16,"999","P")
    //從FTP地址獲取圖片。如:西門子2120的圖在ftp上獲取
    s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD("ftp://lis:[email protected]/MCImage/19-0.jpg","","zlz.bmp","zlz")
	//把Base64串處理成圖片存到ftp上
	s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetImgByBase64MTHD("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","","zlzbase64.bmp","zlz")
	s charStream=##class(%GlobalCharacterStream).%New()
 	d charStream.Write("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")
 	//通過base64串得到文件
 	s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBase64StreamMTHD(charStream,"zlzbase64file.bmp","zlz")
	//通過比特串得到文件
	s charStreamBit=##class(%GlobalCharacterStream).%New()
 	d charStreamBit.Write("")
 	s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBitStreamMTHD(charStreamBit,"zlzbase64file.bmp","zlz")
	q ret

繪圖效果
在這裏插入圖片描述
這樣就得到一個M的圖片類,利用M腳本語言的調試修改優勢提高儀器畫圖效率。

本次分享在遇到有處理不了的問題時可以考慮調用別的語言實現。把數據約定好實現代理模式來達到效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章