很久以前到沈阳实习的时候还一个个问度娘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 PLTfor (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;}//打印Xfloat PrintX = Convert.ToSingle(dr["PrintX"].ToString());//打印Yfloat 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;}}}#endregionpg.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;}}}#endregionpg.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;}}}#endregionpg.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);}//有图就上传ftpif (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:lis@127.0.0.1/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:lis@127.0.0.1/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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Label"s PrintX=xs PrintY=ys PrintFont=fonts PrintFontSize=fontSizes PrintFontStyle=fontStyles PrintText=drawStrs PrintAlignment=alignments PrintColor=colors Angle=angles ^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+1q ""
}/// 画复选框
/// 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=20i '$l(height) s height=20i ..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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="CheckBox"s PrintX=xs PrintY=ys PrintText=checkeds PrintWidth=widths PrintHeight=heights ^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+1q ""
}// 画单选框// 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=20i '$l(height) s height=20i ..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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Radio"s PrintX=xs PrintY=ys PrintText=checkeds PrintWidth=widths PrintHeight=heights ^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+1q ""
}// 画线// 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=1i '$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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="ILineN"s PrintX=xs PrintY=ys PrintWidth=x1s PrintHeight=y1s PrintLength=sizes PrintFlag=dashStyles PrintColor=colors ^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+1q ""
}// 画条码// 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=5i '$l(height) s height=20i ..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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Data"s PrintX=xs PrintY=ys PrintFont=fonts PrintFontSize=fontSizes PrintFontStyle=fontStyles PrintText=barStrs PrintWidth=widths PrintHeight=heights PrintAlignment=alignments PrintColor=colors Angle=angles Flag=""i isDrawText=0 s Flag="N"s PrintFlag="BarCode"_Flag_barTypes ^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+1q ""
}// 画点// 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=2i '$l(height) s height=2i ..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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Point"s PrintX=xs PrintY=ys PrintWidth=widths PrintHeight=heights PrintFlag=types PrintColor=colors ^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+1q ""
}// 画多边形// 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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Poly"s PrintText=pointss PrintColor=colors ^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+1q ""
}// 画图片// 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=80i '$l(height) s height=80i '$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=1s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0s PrintType="Graph"s PrintX=xs PrintY=ys PrintWidth=widths PrintHeight=heights DataField=dataFieldi 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+1q ""
}/// 执行绘图
/// 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=imgWidths PrintHeight=imgHeights PrintColor=bkColors ^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_"#"_ftpFfolderNames 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=40s 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=xNums xXiShu=(imgWidth-10)/pointNums 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=0f 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=curYs 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:lis@127.0.0.1/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_"#"_ftpFfolderNames 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("/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiub8XaxqWkxWQ0ufTVnuLiGBo7tWZgsk8UXmqqsC4UyAFcj76ncMbXAOkory+y+IOqXsFtCxgMlxd2jx3MMHk/uHfTiUaNnk+YrfMpIbjbxycjoF8VSRaZpX2S+0q9mu5ZreNtWum02aZ45PL2iIxMWkB+VgFX5uQoDAAA7CivP9L8SeKbbwDpuvXllY3zXMVvLO8moGIRRukS+adtvhVyXkcHIQBiGIwF0NM1bxZDq1pomo6dpVzN5TTXF3DqLkxxCQKpdRbgeYwJx91XMUhGwDAAOworzvxF4z8Q6Jq2j2txZaNb+bcEzqmozSKIvJmIMrfZf3Sbk3b/APpk38Kuy9xpsmpS27NqlpaW0+/Cpa3LTqVwOSzRoQc54x2HPPABcooooAKKKKACiiigAooooAKKKKAOD+LU81v4TtHglkiY6paqWRipwX5HFd5Xn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xVplxqkFisNlBcra3cV4odwsgljdTHtYghFzku4ywQMqqxcbegooA8zh8CT6bYackNrd3F9a3tnA8izRCFoI3si0+CQwGyyT5eWDs4G5dr1qWWg+IPN0sGKxtYbLxBf37PJM0jvBI0+zCKAAzCdur/AC4UkMSUHcUUAcXpNrr+l+HF8OXOhWmoxW6CwtpXnVLea2SCNd8+dzgufMG1Y2AI2nj5zc0vT9U8P3gWS2/tZLnyo5L9JsTx4GArLKxzCnzkEOX+flXcvI/UUUAef6v4Q8QXWq2M4vtKvVkuy9291prPhDazx7WHngNCDKyrGAMeZuYsd7P2GjWV5p2nJa3l/wDbWjwElKFW24HBJZi2DnBJLbdoYswLtoUUAFFFFABRRRQAUUUUAFFFFABRRRQB5/8AGD/kULP/ALCtp/6Mr0CvP/jB/wAihZ/9hW0/9GV6BQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXiHj5BP4g8QyrpcFxNaRXkwlj06xkceTaWLIZWnQlo1M0mdpL/MAOAAAD2+ivI/B+mtB4svdLtoZNGlCXSeethYR3aKi6fIoZoYzGRmaTjB4YZ5UYuWFpq/+jCHxVqqeIr27W21KJYbTy1MGPOmKeRlVMe0I5GWEtsG4K4APUKK83+JUN/ZeFNQhi8QarcTXOnzr9k22ojMccBMskhEBcKQMEqQN8qKCgYFek8KreTJLcXmtalczwu9tcWV0LfbDKrDJBjhjYgjDKTjcjq20ZGADpKKKKACiiigAooooAKKK5/x3/wAk88Tf9gq6/wDRTUAc/wDGD/kULP8A7Ctp/wCjK9Ar5g8Zf8kVtv8AsK6b/wCmiGu/l/5KH48/7Cvhv/0bFQB7BRXn/wDzO/8A3Nf/ALha5/xD/wAgPwn/ANlAf/0tuqAPYKK+QP8AmSP+5U/9zVdB4N/5Adz/ANk/1L/0tmoA+n6K8A8Jf8jP8Rf+xr03/wBOTVv3n/JetG/7Ct//AOmu0oA9gorwDxf/AMiR4+/7Zf8Ap6vqPh//AM0d/wC41/7NQB7/AEV8wJ/yHPiP/wBhW9/9ItUr3/wJ/wAk88M/9gq1/wDRS0AdBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXH6x8O9O1vU7q9ubyf/AEiXzjC9pZzoj+XHGSvnQOy5WJM89q7CigDi9O8BSaBerd6Lq0cTpbzRJFcabAIlaR4Sz7bdYcnbCF5J/hORghtT/hGZYf8ASrXWr5dW/jvZgj+eo+7HJGFVPLB7IEYZcqymRy3QVFc3MFnay3NzMkMESl5JJGwqKOSSewoA5zXPBVr4g0m9iurmeLUry0aCW7tp54kLGPaMxCTDRg5YRsSo3P3didTTfD+n6VcNcW32tp2TY0lxezTsy5BAJkdiQCDtB+7ufGN7Zzf+Fi+C/wDoadI/8C0/xq5ceK9HtxpJF2Jxq0whsvs6mTzT1LDH8IHJboKANqiiqGq61peh2y3Oq6hbWULNsWS4kCAt1wCe/BoAv0VzP/CxfBf/AENOkf8AgWn+Nauk69pGvRSS6TqVrfJEQrtbyhwpPTOOlAGjRRRQAVz/AI7/AOSeeJv+wVdf+imroKzPElnFqPhbV7Ge7S0hubKaGS5cDbCrIQXOSOADnqOnWgD5z8Zf8kVtv+wrpv8A6aIa7+X/AJKH48/7Cvhv/wBGxVi/Ejwva6Z8OtM0ZNWM73Wo2UsUi2rYKJax2uTgkAHaH5I67ecZrtX0fTm1vxVrY1K6YXd9pk0kCaZMzxm1kUgIAN0quUI3IMDnrg0AS/8AM7/9zX/7ha5/xD/yA/Cf/ZQH/wDS26rrvs+n/wDCTx3DX1wkkmo/2uEksJVQD7D9n8tpCNqtgGTBw2ONveqFxoem6zpOiIustbC08THU0FzZvDJLI00swg8uQqwOJfvYOQu7GDwAeA/8yR/3Kn/uaroPBv8AyA7n/sn+pf8ApbNXWt8KdPTS7vR28TTh7XRzYySf2RJhgL37UXT5sSEZCFUJIJHf5a1NC+HFhpmkQD/hJCyX+h3Ph+AyWDRMXmmll3FGbcGXLAoQD8pJI6UAc94S/wCRn+Iv/Y16b/6cmrfvP+S9aN/2Fb//ANNdpXQaT8Mv7L1TxHe/2v5v9s6rbals+zbfJ8m5M+zO87s5254x1welaE3gXzfHtn4n/tHH2a7nufs3kfe821ht9u7dxjyd2cc7scYyQDzDxf8A8iR4+/7Zf+nq+o+H/wDzR3/uNf8As1d/rHwy/tXQ9f03+1/K/tfb+8+zbvK23s9103jd/r9nUfdz3wDw/wDDL+wv+EO/4m/n/wDCN/bf+Xbb9o+0Z/2zs2598+1AHkCf8hz4j/8AYVvf/SLVK9/8Cf8AJPPDP/YKtf8A0UtcePg/i+8SXP8Abv8AyGrua52/ZP8AU+ZDdRbc7/mx9qznjOzHfI9A0LTP7E8PaZpPned9htIrbzdu3fsQLuxk4zjOMmgDQooooAKKKKACiiigAooooAKKKKACiiigAooooAK5n4i/8k38Sf8AYOm/9ANdNWL4w0y51nwbrOmWYU3N1ZyxRBjgFmUgc9qAKeqeN9N0LxA+mawsljEbU3MF5LjypwoJdAf7ygZweTn6Z5nwxcNqPiqy8U63BIt5rfmQaNauv/HpaIhcufR3ABOOeQOmava0+r+IrJLPV/hwby3SRZVSTU4MBlOQeD/+sEg8Gp4ovEOt+LtDvb3w9/ZVppnnuzveRy798ewKAn1zzQB29cz4k/5Gnwd/2EZv/SOeumrmvFlrqjXehalpen/b5NOvHlktxMsRZWglj4ZuOC4NAHS1yWhf8lG8Xf8AXOx/9Aej/hIvFn/QjTf+DSD/ABp3haz1c6/r2s6rpo077f8AZ0itzOsrARqwJJXjnd+lAHV0UUUAFRzrK1vIsDokxUhHdC6q2OCQCMj2yPqKkopNXVgPKPijpV5a+EdFea9hleG8tLefZblFlAkG0qC5KY5zy2c9q7CbwveXFtqkdzqFpdm9lVkS8sjNEEU8K8bSYbj+4YxkZ25JzjfGD/kULP8A7Ctp/wCjK9ApvUDnF8LuNTtrlrm2eGG2EDIbU+Y+EK7S4fHl8k7CpIJOGGaisPC99pmjm2ttThN5LeLdXFxPBLMr7duFUPMXHCIMs7dDxjAHUUU79f67gc5/wjEy63qOqRagIpp4WitQqSFYC20sxVpCpJZQTsEeec5OGFObwbqDpojQ+IZIZtOlDy5tllSdd25gPMLSKx4G7exx1yea6+il28geu4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVjXHi7w3aan/Ztzr2mw327aYJLpA4PYEE8H2pvjG6vrLwVrd1pu77bDYzPCV6qwQ8j3HUe4r4cZmdizEszHJJOSTQB9ffGD/kULP8A7Ctp/wCjK9ArwGG81C9/Z+8Oyagzs66rBHE79WjWYhfyAwPYCvfqACobu7t7G0kurqVYoIhud26KKmrnfHf/ACI2r/8AXA/zFTOXLFs2w1JVa0Kb2bS+9h/wnfhf/oN2v5n/AArX0/UrLVrQXVhcJcQElQ6dMjrXyvXvfwn/AORHj/6+JP51xYbFyqz5Wj6bOuH6GX4b21OTbulrbz8juKKKK7z5MKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr3t4lhbNcypI0KcyNGu4oP7xA5IHtmltLy2v7ZLm0njnhcZWSNgwP4ip6828V+G9U8OXMviHwlNJApO+7s4xlD6sF6Eeo7dRWVScoLmSujuwWHpYmXspS5ZPZvZ+T7ep6TRXm3hz4t2F9st9biFlOePOTJiY+/df1HvXo0M0VxCk0EqSxOMq6MGVh6ginTqwqK8WTjMBicHPlrxt+T9GPrz+6+CvgW71U376QUZm3tBFMyRE/7oPA9hgV6BRWhxnnfxYt4bTwPp1tbRJDBFqdmkccahVRQ4AAA6AV6JXn/xg/5FCz/7Ctp/6Mr0CgAqpqWn2+rabPYXQYwTrscKcHH1q3RSaTVmVGThJSi7NHD/APCp/C//ADyuv+/5rp9D0Sy8PaaLCwVxAGLgO245PXmtGiojShB3irHVXzDFYiPJWqOS82FFFFaHGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxrgdB8Vax4cm36ddssZOWhf5o2+q/wBRg19NV5H8RPh3s83W9Eh+Tl7m1QdPV1Hp6j8a83E4ZxftaR9rkmd060FgsdZp6Jv8n+jN3w38VdJ1XZBqgGnXR43McxMf97+H8fzrvlZXQOjBlYZBByCK+Ta6Dw9401rw04WzuS9tnLW03zRn6Dt+GKijj2tKh05jwnCd54N2fZ7fJ9Pnc9T+MH/IoWf/AGFbT/0ZXoFeJeMPHtj4s8J2lqsElvfpqNrI8R+ZSocZIb0HvivbeoyK9KFSM1eLufFYnCV8LP2deLi/627hRRRVnMFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxryivrOvI/iJ8O9nm63okPycvc2qDp6uo9PUfjXmYvCfbh9x9zw/wAQXthcU/R/o/0Z5RXU+HPH2t+HCsUc32mzH/LtOSQB/snqv4ce1ctRXnQnKDvF2PscRhqWIh7OtFSXmfQ/hv4h6J4h2Q+b9jvW4+zzkDcf9lujfz9q6yvkyuy8N/EnW9B2QzP9vs148qdjuUf7LdR+OR7V6NHH9Kn3nxuY8JPWeDf/AG6/0f8An959A0Vzfh3xxoniRVS2uPJuiObab5X/AA7N+FdJXoxnGavF3Pja+Hq0JunVi4vzCiiiqMQooooAKKKKACiiigAooooAKKKKACiiigDO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoqfeNb0v5X96/yM7+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPej+2rX/nlf8A+s8v/kHz9f8Avjp/tdPetGij3gvS/lf3r/Izv7atf+eV/wD6zy/+QfP1/wC+On+1096P7atf+eV//rPL/wCQfP1/746f7XT3rRoo94L0v5X96/yM7+2rX/nlf/6zy/8AkHz9f++On+1096P7atf+eV//AKzy/wDkHz9f++On+10960aKPeC9L+V/ev8AIzv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKPeC9L+V/ev8jO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoo94L0v5X96/yM7+2rX/nlf8A+s8v/kHz9f8Avjp/tdPej+2rX/nlf/6zy/8AkHz9f++On+10960aKPeC9L+V/ev8jO/tq1/55X/+s8v/AJB8/X/vjp/tdPej+2rX/nlf/wCs8v8A5B8/X/vjp/tdPetGij3gvS/lf3r/ACM7+2rX/nlf/wCs8v8A5B8/X/vjp/tdPej+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPetGij3gvS/lf3r/I8O+JHh3TrV/7Z0tJ4EmuBDNBJayRL5h6FCygYJ4wO54rgJYpIJWiljaORThldcEfUV7h8YP+RQs/+wraf+jK7DU9D0vWYvL1GxguRjALp8y/Ruo/A1w1sCpvmi7H1WX8VSw8FSrRckut9fy1PlyivZtY+Dmnz7pNIvZLV+oimHmJ9Aeo/WvP9Y8AeI9F3NNYNPCv/La2/eL9cDkD6gVwVMNVp7o+sweeYHFaQnZ9no/+D8jmgSrBlJBByCO1d14b+KWsaPsg1DOo2g4/eN+9Uezd/wAc/UVwhBBwRgiis4VJ03eLsdmKwdDFw5K8VJf1s+h9HaT490DWUjFpPO074BtxbSNIv1Cg8e/T3rU/tq1/55X/APrPL/5B8/X/AL46f7XT3r5fjkkhkWSJ2SRTlWU4IPsa9D8N/FnUtO2W+sIb+3HHmjiVR9ejfjg+9ejSx99J6Hx2P4U9mufC3l5NpP5aanrv9tWv/PK//wBZ5f8AyD5+v/fHT/a6e9H9tWv/ADyv/wDWeX/yD5+v/fHT/a6e9R6J4k0nxDb+bpt2kpAy8Z4dPqp5/HpWrXem5K6Z8lUhGlJwqQaa6N/8Azv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKfvGd6X8r+9f5Gd/bVr/zyv/8AWeX/AMg+fr/3x0/2unvR/bVr/wA8r/8A1nl/8g+fr/3x0/2unvWjRR7wXpfyv71/kZ39tWv/ADyv/wDWeX/yD5+v/fHT/a6e9H9tWv8Azyv/APWeX/yD5+v/AHx0/wBrp71o0Ue8F6X8r+9f5Gd/bVr/AM8r/wD1nl/8g+fr/wB8dP8Aa6e9H9tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvWjRR7wXpfyv71/kZ39tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvT49WtpN22O8G1ip3WUy8j0yvI9xxV6ij3gbpdE/v/wCAFFFFUZBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAef/ABg/5FCz/wCwraf+jK9Arz/4wf8AIoWf/YVtP/RlegUAFFFFAGLrHhPQtdDG/wBOheQ/8tVGyT/voYJ/GuA1j4Nfek0bUfpDdD/2dR/T8a9ZorGph6dT4kelhM3xuE0pVHbs9V9z/Q+ZtY8J67oRY3+nTJGP+WqjfH/30MgfjWLX1mRkYPSuZ1jwB4c1rc01gsEzf8trb9231wOCfqDXDUy97wf3n1GE4wi9MVC3nH/J/wCZ8721zPZ3CXFtNJDMhyskbFWB9iK9J8N/F26ttlvr0Juoun2iIASD6jo36fjSax8HNQg3SaRex3SdRFMPLf6A9D+lcFqeh6po0vl6jYT2xzgF0+U/Ruh/A1zJV8O77fke3KWV5xDlbUn90l+v6H0ppOt6brlqLjTbyO4j77T8y+xB5H41fr5VsdQvNMulubG5lt5l6PG2D/8AXHtXp/hv4vsNlv4gg3Dp9rgXn/gSf1H5V3UcdCWk9GfLZjwrXo3nhnzx7df+D/Wh63RVXT9SstVtFurC6iuIW/jjbOPY+h9jVqu5NNXR8rKMotxkrNBRRRTJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8/wDjB/yKFn/2FbT/ANGV6BXn/wAYP+RQs/8AsK2n/oyvQKACiiigAooooAKKKKACmSxRzxNFLGskbDDK65B+op9FAJ21RxmsfDDw5qm54bdrCY/xWxwv/fJ4x9MV5/rHwk1yx3Pp8kOoRDoFPlyf98nj8jXudFc1TCUp9Leh7WE4gx+F0U+Zdpa/8H8T5hgudb8K6lujN1p10OqspXcPcHgj68V6Z4b+L0E2y31+DyH6faoQSh/3l6j8M/QV6VeWNpqEBgvbWG4iP8EqBh+tcPrHwk0O+3Pp8k2nynoFPmR/98nn8jXOsPWou9J3XY9eec5bmS5cdT5ZfzLX/g/KzO5tLy2v7ZLm0njnhcZWSNgwP4ip68SHhDxv4LuWutHka4izlvsrbg4/2oz1/AH610+gfFa0nlFn4gt2067B2mTafLz7g8r+OR71vDEq/LUXK/wPLxORy5XVwU1Vh5fEvVf16Ho1FMhmiuIUmglSWJxlXRgysPUEU+uo8Npp2YUUUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/jB/wAihZ/9hW0/9GV6BXn/AMYP+RQs/wDsK2n/AKMr0CgAooooAKKKKACiivn2Jgr8qGBB4P0oA+gqK8ADYKfexzkAcfiaRcNKqFgoJxk9qYH0BRXgat9oMMEMS7efmzjk/XgVVmXD4BzSA+hqK+dj060itjOeRjvQB9FVn6noel6zF5eo2MFyMYBdPmX6N1H4GvCpbuRrdIXO5VPyj0qpkdCBQ0mrMqE5wlzQdn5HrsXga40OZp/C+sTWQJy1pcjzYH9sdR9eTW1aatfRARazp5tpBx9ogbzYG98/eT/gQA968JEp8sqM4PJXjrj/AOuaRIXlf5QST6VnGmo/DodVXGzrr9+uZ99n9/X53Po9WDKGUgqRkEHg0tfNm08cHr6dKqXkoilVTHM/y5ygyO9apXONn09RRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAr5+VOehzX0DXgZ+VuBkE8nPSgBrAgGqzZDVbIBOAfmA/HH+RUDoGzg+4/xouAxHKsvOC3bPenSKcZccHv61HyHAMeQBkNnv6Ypzy7+uQQMZFADOc4/IUEYw3bOBgdf880h6HOCPQjrS7+2OmaQEUjbULFGfHOE69akS2V0lbeoIGQpzk/SojkHihJcEkOoyMDB5pgRsCrMDwfQ09JzGjqrlVcYbB6inzwu6mcqQjNgN2PTP86r7SAKALCTkNg45BHIzx6/yqjcNmXqelTHkdAQT3qCZVL8bTjg4HSgD6cooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigArwYKD3HUjFe814hG8f2RxtUSbgQe5/pj/GgCrHLGGDELNGSQQScehHFDLviZgygg8Z5pm1VwI1UJzkDjH+eaiYuEYxqJWH8BOM80WAjZCXxkc9icCmzwtbzSROQWQkHHIqTary4VQDnjPalkjKK5ZkID4XB5xQBW57nI9MUbQcZ7e9IxyPUH0NAOeM4oAI0MrKqkNvxtDcU+OIyxMy4ZEGTg9ulN4yOOT7UE9O2KABpCICuOBltq+tNbYBnaRgcnP9KXPpjilRN5PUgDkAUIGWtN0W51NZ3hX5YYy7nPQCsa6BWbHoOa04buax3JE7AHg89qzLp902SeSKBn01RRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigArwNW3HHr1Fe+V8+Ru0b7hgc0AWZdkfyiRXcKCdoIyT9feqpJXr170jyfu8n73BH164pxAKFy4yDjbjk+9AEZwfm53DkH0OMUjdSc9OKbuyMHJzwe1E0+8LhFXaMfKOvufegBYzHvHmAkYOB057VCTzxRvXYzOcKOpJofo20hmXjGcc+lAD1BZcgdPWmE8YNO3D7pCnuDjkfjQqOyk7S2PTvQA0En60okYYI3KSPoR7U3Bx6H2FTLFvQtkAL78mgCs5LMeeSaqz/fB65FXCMEcdz0HSqs6jeoAwAvagD6booooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigAr50Y/N/8AWr6Lr52RQznJwOpPpQAzccZwRmpJY2jRGOMOOMH3x/SmMDvIU4VeBkfrTdw2KCGGeAPfr+tMBQOM4zSyDe4UJgFcjHPTr/jTsqq5O4nGOOh/zxTY5fKBbIA5JJPTPvQBGoI4xn1qZlBjR2cAltpU9R0x+eafDGHkIJxnpnvUiwJsdmcbcAg9vakBWlRN+IyWXOASMVYtpJo4pFjLBHADAd+c4pI4N8uN2PfNTpuVNgZtmclefzouBVliZHIIqMAjAGQOgFXHtyGORjPJFN8nkkqdoBPA6UXAqbB24+gqpcx/vByRx2rYktih6fnVG5j/AHg+lFwPo2iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/AIwf8ihZ/wDYVtP/AEZXoFef/GD/AJFCz/7Ctp/6Mr0CgAooooAKKKKACvnQEA4PIHUV9F185YAUKM4HqaYDm+cgn1zTehpVB/xyafsyT7EYoAnt7KaVkRnHznIZyFzyfwx05qF4ikjKD0PUVLEu6dFdgikgFqva5a2tjdmO1uftCbQd46dOcUMEjOVgrjk7iCQAKfxJ8jZwfSoBL6ULJznle3XrSAvSI8LDcNpb5sH0PSlWQEMGOVbggnt6VSabKhF7ds09FcqX2/KD1x3pNDLwIJ2oVIJwo9B6e9SxGNJSkqgqeGFUkZh82M+2OtSRvGciVwjbcqDyCfTP+elAGi8JuFllAyqDOBxwTgVlXCfvB8h6elSpcsgZVbgnJFVrmQmQY9KVho+g6KKKokKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8AIoWf/YVtP/RlegV5/wDGD/kULP8A7Ctp/wCjK9AoAKKKKACiiigAr5zCkfXvxX0ZXznLMUjTCryOaaEx/IAwfrT43VJVYoGwc1Q+1yZPC/lSvduoXCryfT2oQXL8ke/y+5IyvGDRMFEQU7jLzxxjAx/jWaL6VWDDbkEVJJcndny4+v8AdoC48qQaBkHntUYnbyidq5PPeoftT56L+VKw7l/eDEAsYV1zlic7vSpxcyLbiESgRhg5TPBOMcj6ZrJN3J0wuMelMN0/J2pk4yccmnYLmyJPmY+YTlQNh6DGeR+dQ+Z39eazBdOeCF4OelO+1ybRwv5UCNNGJfHrxTJmJYEE9KpRX0sUoZVj4wQCuRxRNfS7xwnT0oC5/9k=","","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_"#"_ftpFfolderNames 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_"#"_ftpFfolderNames 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_"#"_ftpFfolderNames 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_"#"_ftpFfolderNames 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 $$$OKs 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 $$$OKOutputSet 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+1quit
}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=1Set Row=""}Else      {   Set Row=^CacheTemp(repid,ind)}// Save QHandles 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:lis@127.0.0.1/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:lis@127.0.0.1/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脚本语言的调试修改优势提高仪器画图效率。

本次分享在遇到有处理不了的问题时可以考虑调用别的语言实现。把数据约定好实现代理模式来达到效果。

当绘图遇上Caché之元数据代理相关推荐

  1. c++win32项目 如何显示后再删除一个绘图_【AC学习】当乐高遇上BIM(7):绘图中的数据展示...

    介绍 正如在之前文章中提到,我们可以将数据加入3D模型以创建建筑信息建模(BIM).这些数据被嵌入进了模型的不同位置,比如项目.场地.建筑.楼层(建筑楼层).空间.区域.组件/构件.类型和系统.我们会 ...

  2. 当DUBBO遇上Arthas - 排查问题的实践

    Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户. Github: https://github.com/apache/incubator-dubbo 文档:htt ...

  3. 当摸鱼的老油条遇上了内卷的小年轻...真的是被卷怕了....

    软件测试岗当摸鱼的老油条遇上了内卷的小年轻,这是一个有趣的故事.老油条在公司里已经干了好几年,对软件测试的各种技巧和方法都非常熟悉,但也由于他的经验丰富,经常会被视为不求新进展而"发呆&qu ...

  4. 《寻梦环游记》背后:一出“硅谷”遇上“好莱坞”的好戏

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 现实总比电影精彩. 最近上映的动画片<寻梦环游记>(Coco),大家都看了吗?它简直要把小探的眼泪都赚光了好嘛.. 作为皮克斯动画公 ...

  5. “直男变暖男”—— 当推荐系统遇上知识图谱

    本文转载自文旅记,详情可以扫描下方二维码: 作为一个文科生,深知文化娱乐.旅游休闲.市场营销等领域正在迎接推荐算法的洗礼,传统的分析.内容生产,势必会发生改变.因此笔者一直关注技术领域,斥巨资(狗头保 ...

  6. 当TensorFlow遇上Kubernetes ---中兴通讯人工智能计算平台的技术实践

    本文由 [FMI飞马网]原创,原文链接:当TensorFlow遇上Kubernetes ---中兴通讯人工智能计算平台的技术实践 分享一些关于大数据的干货​:TensorFlow介绍.安装教程.图像识 ...

  7. 推荐系统遇上深度学习,9篇阿里推荐论文汇总!

    作者 | 石晓文 转载自小小挖掘机(ID: wAIsjwj) 业界常用的推荐系统主要分为两个阶段,召回阶段和精排阶段,当然有时候在最后还会接一些打散或者探索的规则,这点咱们就不考虑了. 前面九篇文章中 ...

  8. 华为平板电脑_当5G遇上平板电脑,华为MatePad Pro 5G带来了什么?

    5G已经来临,科技产品向5G升级已是大势所趋,这更是检验实力的探索之路. 2月24日,华为在巴塞罗那在线发布了一系列新品,其中,华为面向全球推出的5G高端旗舰平板,同时也是全球首款公开发布的5G平板华 ...

  9. 404未找到是什么意思_为什么老遇上404 not found?你懂的

    文章转载自公众号:一只学霸(bajie203) 昨天晚上 大毛火急火燎地打开了电脑 戴上了耳机 不到两分钟 -- 我们往前一凑 登等 果然是大家最害怕的一幕出现了 学霸在网上冲浪多年 留下的都是美好的 ...

  10. 《当用户体验设计遇上敏捷》一3.5 小结

    本节书摘来自异步社区<当用户体验设计遇上敏捷>一书中的第3章,第3.5节,作者[英]Lindsay Ratcliffe , Marc McNeill,更多章节内容可以访问云栖社区" ...

最新文章

  1. html 颜色叠加图片,如何在背景图片上添加颜色叠加?
  2. 人工智能的鱼与熊掌:精度与可解释性
  3. AAAI2018正式落幕 13个世界顶尖AI教授都讲了啥?
  4. 20155213 2016-2017-2 《Java程序设计》第七周学习总结
  5. Cocos Creator实现的《点我+1》
  6. MPI学习存在的一些问题
  7. php tp5.3,[李景山php]每天TP5-20161226|thinkphp5-Console.php-3
  8. sql server 配置管理器里为什么是32位_FT VIEW | SE高级应用之数据存入SQL数据库
  9. 武汉Web前端开发薪水没有别人高?先弄明白这4点
  10. 毕业设计——阶段性成果展示
  11. 绝妙一招 教你如何拍出烟雾缥缈的作品
  12. 【Books系列】席慕蓉《回眸》欣赏
  13. 联通4g 小米不显示无服务器,小米旗舰机断流严重,信号满格消息却发不出去?...
  14. 蓝桥杯-打印菱形/字符串截断
  15. 室内定位技术应用现状
  16. echarts图表y轴数据设置为固定值,等间距,如何自定义echarts图表y轴数据
  17. 计算机领域中的CAE,CAE
  18. PFO-Ir|PFO-Ir-OXD|D-Ir-Caz|D-Ir-OXD离子型铱配合物共轭聚合物
  19. 基于Java+Spring+Vue+elementUI大学生求职招聘系统详细设计实现
  20. 组织中的各种架构师分类

热门文章

  1. 一文熟练使用spring data jpa
  2. Ubuntu下如何截屏
  3. vs201X的TFS(Team Foundation Server) 设置为:不自动签出
  4. php程序的完整路径和文件名,php从完整文件路径中分离文件目录和文件名的方法...
  5. 【SpringCloud】-- SpringCloud简介
  6. [MATLAB]数据统计分析平均值(mean/median/sum/prod/cumsum)
  7. 华南技术盛会:BingoDay2017今在天河人才港盛大举行
  8. 微软已修复Windows10蓝屏死亡(BSOD)错误
  9. 计算机与量子力学交叉,量子计算主要是基于量子力学的相干特征.PPT
  10. 生产制造MES系统源码 采购管理模块解析