using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.CV.Util; using Lucee.WebBase.Data; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Lucee.WebBase.Utils; using System.Net; public partial class Temp_TempDraw : System.Web.UI.Page { public static BoxType bt = null; public long tenant = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { int action = Convert.ToInt32(Globals.Request("action")==""?0:Convert.ToInt32(Globals.Request("action"))); if (action == 1) { Response.Clear(); DrawGo(); Response.End(); } } } private void DrawGo() { long TempID = Convert.ToInt64(Globals.Request("TempID")); long UserID = Convert.ToInt64(Globals.Request("UserID")); tenant = Globals.Request("tenant") == "" ? 0 : Convert.ToInt64(Globals.Request("tenant")); //开始阅卷 //获取主模板ID DataTable dt = MK_Data.GetMainTempData(TempID); if (dt.Rows.Count > 0) { //获取机阅基础数据 bt = MK_Data.GetBoxType(MK_Data.GetMainTempDataMainBoxType(Convert.ToInt32(dt.Rows[0]["MainID_bigint"]))); string[] GetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$'); int width = Convert.ToInt32(GetData[6].Split(',')[0]); int height = Convert.ToInt32(GetData[6].Split(',')[1]); dt = MK_Data.GetMinTempDataUser(TempID, UserID); string imgUrl = Globals.Request("imgUrl"); Bitmap bmp; if (imgUrl == "") { bmp = new Bitmap(UrlToImage(dt.Rows[0]["TempPicture64_nvarchar"].ToString())); } else { bmp = new Bitmap(UrlToImage(imgUrl)); } //还原图片大小,这里可能有逻辑错误 bmp = MK_Operater.ScaleToSize(bmp, width, height); //获取旋转偏移量 string[] PXGetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$'); bmp = MK_Operater.ImageRotates(bmp, (float)Convert.ToDouble(dt.Rows[0]["Rotate_float"])).Bitmap; //切换模板数据 dt = MK_Data.GetMainTempData(TempID); string[] FinleGetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$'); FinleGetData[0] = PXGetData[0]; //斜率 double xielv = Convert.ToDouble(dt.Rows[0]["XieLv_float"]); //原始宽度 int oldWidth = Convert.ToInt32(dt.Rows[0]["CutWidth_int"]); //原始高度 int oldHeight = Convert.ToInt32(dt.Rows[0]["CutHeight_int"]); //原始坐标 string PYPostionList = dt.Rows[0]["PyPPostion_nvarchar"].ToString(); //切换执行数组,如果没得定位点就不要覆盖原始数据 Mat color_mat; Mat mat_dilate; VectorOfVectorOfPoint selected_contours; CommonUse commonUse = new CommonUse(); string[] PYPostion; if (GetData[0] != "") { string[] postionc = GetData[0].Split('^'); //pb_image.Image = bmp; for (int i = 0; i < postionc.Length; i++) { string[] postCutList = postionc[i].Split(','); int X = Convert.ToInt32(Convert.ToDouble(postCutList[0])); int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1])); int W = Convert.ToInt32(Convert.ToDouble(postCutList[2])); int H = Convert.ToInt32(Convert.ToDouble(postCutList[3])); //bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1); } GetData = FinleGetData; //换算未灰度图片 并选取点 Image EmguImagex = new Image(bmp); Mat mat_threshold = new Mat(); CvInvoke.Threshold(EmguImagex, mat_threshold, 120, 253, Emgu.CV.CvEnum.ThresholdType.BinaryInv); mat_dilate = commonUse.MyDilate(mat_threshold); selected_contours = commonUse.GetUsefulContours(mat_dilate, 1); //color_mat = commonUse.DrawContours(mat_dilate, selected_contours); //Response.Write(ImgToBase64String(color_mat.Bitmap)); //bmp.Dispose(); //return; //获取当前斜率 float myXielv = MK_Operater.GetPostionXYByFindRoteBmp(EmguImagex.Mat, selected_contours, GetData[0]); if (myXielv == -100||myXielv==0) { Response.Write("-1"); return; } //同步主图斜率 float flagxie = ((90 - myXielv) - (90 - (float)xielv)); //更新图片 EmguImagex.Bitmap = MK_Operater.ImageRotates(bmp, flagxie).Bitmap; //重新查找点阵 CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv); Mat mat_dilate6 = commonUse.MyDilate(mat_threshold); VectorOfVectorOfPoint selected_contours6; selected_contours6 = commonUse.GetUsefulContours(mat_dilate6, 1); //color_mat = EmguImagex.Mat; //color_mat = commonUse.DrawContours(color_mat, selected_contours6); //Response.Write(ImgToBase64String(color_mat.Bitmap)); //bmp.Dispose(); //return; //根据定位点重新裁剪图片 EmguImagex = MK_Operater.GetPostionXYByFind(EmguImagex.Mat, selected_contours6, GetData[0]); if (EmguImagex == null) { return; } //等比例同步 EmguImagex.Bitmap = MK_Operater.ScaleToSize(EmguImagex.Bitmap, oldWidth, oldHeight); //下列操作项定位点数据 PYPostion = PYPostionList.Split(','); //最终选取图形 CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv); mat_dilate = commonUse.MyDilate(mat_threshold); selected_contours = commonUse.GetUsefulContoursYueJuan(mat_dilate, 1); color_mat = EmguImagex.Mat; color_mat = commonUse.DrawContours(color_mat, selected_contours); bmp = color_mat.Bitmap; } else { PYPostion = "0,0".Split(','); Image EmguImagex = new Image(bmp); Mat mat_threshold = new Mat(); CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv); mat_dilate = commonUse.MyDilate(mat_threshold); selected_contours = commonUse.GetUsefulContoursYueJuan(mat_dilate, 1); color_mat = EmguImagex.Mat; color_mat = commonUse.DrawContours(color_mat, selected_contours); bmp = color_mat.Bitmap; } //如果要取条码 if (GetData[5] != "") { string[] tiaomaData = GetData[5].Split(','); int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2])); int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3])); bmp= commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1); } //如果要取填涂 if (GetData[1] != "") { string[] XuehaoData = GetData[1].Split(','); int X = Convert.ToInt32(Convert.ToDouble(XuehaoData[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(XuehaoData[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(XuehaoData[2])); int H = Convert.ToInt32(Convert.ToDouble(XuehaoData[3])); int num = Convert.ToInt32(Convert.ToDouble(XuehaoData[4])); int wL = Convert.ToInt32(W / num); int hL = Convert.ToInt32(H / 10); bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, num, Y, hL, 10); } //缺考 if (GetData[4] != "") { string[] quekao = GetData[4].Split(','); int X = Convert.ToInt32(Convert.ToDouble(quekao[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(quekao[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(quekao[2])); int H = Convert.ToInt32(Convert.ToDouble(quekao[3])); bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1); } if (GetData[2] != "") { string[] keguantiList = GetData[2].Split('^'); for (int i = 0; i < keguantiList.Length; i++) { string[] keguanPos = keguantiList[i].Split(','); int X = Convert.ToInt32(Convert.ToDouble(keguanPos[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(keguanPos[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(keguanPos[2])); int H = Convert.ToInt32(Convert.ToDouble(keguanPos[3])); int xuanXiang = Convert.ToInt32(keguanPos[6]);//选项数量 string bigTihao = ""; if (keguanPos[5].ToUpper().Contains("M")) // 如果存在客观题 { bigTihao = keguanPos[5].ToUpper().Split('M')[0] + "M"; keguanPos[5] = keguanPos[5].ToUpper().Split('M')[1]; keguanPos[4] = keguanPos[4].ToUpper().Split('M')[1]; } int tiliang = Convert.ToInt32(keguanPos[5]) - Convert.ToInt32(keguanPos[4]) + 1;//题量 if (keguanPos[7].ToString() == "0")//横向取值 { int wL = Convert.ToInt32(W / xuanXiang); int hL = Convert.ToInt32(H / tiliang); bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, xuanXiang, Y, hL, tiliang); } else { int wL = Convert.ToInt32(W / tiliang); int hL = Convert.ToInt32(H / xuanXiang); bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, tiliang, Y, hL, xuanXiang); } } } if (GetData[3] != "") { string[] Datalist = GetData[3].Split('^'); foreach (string postiontiaoma in Datalist) { string[] tiaomaData = postiontiaoma.Split(','); int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2])); int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3])); bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1); } } Response.Write(ImgToBase64String(bmp)); bmp.Dispose(); } } public static Bitmap UrlToImage(string url) { WebRequest imgRequest = WebRequest.Create(url); HttpWebResponse res=null; try { res = (HttpWebResponse)imgRequest.GetResponse(); imgRequest.Timeout = 50000; if (res.StatusCode.ToString() == "OK") { return new Bitmap(imgRequest.GetResponse().GetResponseStream()); } else { return null; } } catch (WebException ex) { res = (HttpWebResponse)ex.Response; return null; } finally { if (res != null) { res.Dispose(); res.Close(); } imgRequest.Abort(); } } /// /// 检查图片是否空白图片 /// /// Image /// 是否空白图片 public static bool CheckTransparentImg(System.Drawing.Image img) { bool blnIsTransparent = false; //加载位图 Bitmap bitMap = new Bitmap(img); //图片总像素 int intAll = img.Height * img.Width; int intCount = 0; //按像素遍历 for (int intY = 0; intY < img.Height; intY++) { for (int intX = 0; intX < img.Width; intX++) { if (bitMap.GetPixel(intX, intY).GetBrightness() == 1) { intCount += 1; } } } float a = (float)intCount / (float)intAll; Console.WriteLine(a.ToString()); Console.WriteLine(intCount.ToString() + "---" + intAll.ToString()); //释放资源 bitMap.Dispose(); int al = intAll - 1000; if (intCount > al) { blnIsTransparent = true; } return blnIsTransparent; } public static Bitmap Base64StringToImage(string strbase64) { try { byte[] arr = Convert.FromBase64String(strbase64); MemoryStream ms = new MemoryStream(arr); Bitmap bmp = new Bitmap(ms); ms.Close(); return bmp; } catch (Exception ex) { return null; } } public static string ImgToBase64String(Bitmap bmp) { 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.Dispose(); ms.Close(); return Convert.ToBase64String(arr); } catch (Exception ex) { return null; } } } public class MK_Data { public static long tenant = 0; public static void GetTenant(){ tenant = Globals.Request("tenant") == "" ? 0 : Convert.ToInt64(Globals.Request("tenant")); } /// /// 获取我需要扫描的试卷 /// /// public static DataTable GetScanResult() { GetTenant(); string sql = "SELECT top 1 * FROM ScanResult WHERE IsMarking=0 order by GroupNo ASC"; DataTable dt = new MysqlDBHelper(tenant).ExecuteQuery(sql); if (dt.Rows.Count > 0) { return dt; } else { return null; } } /// /// 获取我需要扫描的试卷 /// /// public static DataTable GetScanResultDetail(int GroupNo) { GetTenant(); string sql = "SELECT * FROM ScanResult WHERE GroupNo=" + GroupNo + " AND IsMarking=0 order by pageindex ASC"; DataTable dt = new MysqlDBHelper(tenant).ExecuteQuery(sql); if (dt.Rows.Count > 0) { return dt; } else { return null; } } /// /// 获取主模板数据 /// /// /// public static DataTable GetMainTempData(long temID) { GetTenant(); string sql = "select detaID_bigint from MK_TempleteDataUser where ID_bigint=" + temID; long detaID_bigint = Convert.ToInt64(new MysqlDBHelper(tenant).ExecuteScalar(sql)); sql = "SELECT * FROM MK_TempleteData WHERE ID_bigint = " + detaID_bigint + " ORDER BY PageIndex_int ASC"; return new MysqlDBHelper(tenant).ExecuteQuery(sql); } /// /// 获取主模板数据 /// /// /// public static int GetMainTempDataMainBoxType(long temID) { GetTenant(); string sql = "SELECT BoxType FROM MK_TempleteMain WHERE ID_bigint=" + temID; return Convert.ToInt32(new MysqlDBHelper(tenant).ExecuteScalar(sql)); } /// /// 获取用户模板数据 /// /// /// /// public static DataTable GetMinTempDataUser(long tempID, long userID) { GetTenant(); string sql = "SELECT * FROM MK_TempleteDataUser WHERE UserID_bigint=" + userID + " AND ID_bigint=" + tempID; return new MysqlDBHelper(tenant).ExecuteQuery(sql); } /// /// 判断是否有重复试卷扫入 /// /// /// /// public static bool CheckRepeatMKFlag(string ksNum, string StudentNO) { GetTenant(); string sql = "SELECT COUNT(1) FROM ScanResult WHERE ExamSubjectSchoolId='" + ksNum + "' AND OCRStudentExamNum='" + StudentNO + "' AND ismarking=1"; int count = Convert.ToInt32(new MysqlDBHelper(tenant).ExecuteScalar(sql)); if (count > 0) { return false; } return true; } /// /// 清理所有该用户数据 /// public static void DeleteAllMKSTData(string GroupNo, string StudentNO) { GetTenant(); string sql = string.Format("DELETE MK_ExamResult WHERE GroupNO_nvarchar = {0} AND StudentNo_nvarchar = '{1}'", GroupNo, StudentNO); new MysqlDBHelper(tenant).ExecuteNoQuery(sql); } /// /// 删除已有考号数据 /// /// /// public static void DeleteStudentExamResultData(string ksNum, string StudentNO) { GetTenant(); //删除原始表中的数据 string sql = string.Format("DELETE MK_ExamResult WHERE ExamID_bigint = {0} AND StudentNo_nvarchar = '{1}'", ksNum, StudentNO); new MysqlDBHelper(tenant).ExecuteNoQuery(sql); } /// /// 新增一条错误数据 /// /// /// /// /// /// /// public static void UpdateMkGo(string groupID, string orcStudentNum) { GetTenant(); string sql = string.Format("UPDATE ScanResult SET IsMarking=1,OCRStudentExamNum='" + orcStudentNum + "' WHERE GroupNo=" + groupID); new MysqlDBHelper(tenant).ExecuteNoQuery(sql); } /// /// 新增一条错误数据 /// /// /// /// /// /// /// public static void UpdateMkGoNoOrcStudentNum(string groupID) { GetTenant(); string sql = string.Format("UPDATE ScanResult SET IsMarking=1 WHERE GroupNo=" + groupID); new MysqlDBHelper(tenant).ExecuteNoQuery(sql); } /// /// 获取扫描类型 /// /// /// public static BoxType GetBoxType(int type) { BoxType b = new BoxType(); //红框 if (type == 1) { b.fillRate = 30; b.Threshold = 50; } if (type == 2) { b.fillRate = 60; b.Threshold = 60; } if (type == 3) { b.fillRate = 45; b.Threshold = 18; } return b; } } public class BoxType { public int fillRate { get; set; } public int Threshold { get; set; } } public class MK_Operater { // /// 缩放图片 /// /// 原图片 /// 新图片宽度 /// 新图片高度 /// 新图片 public static Bitmap ScaleToSize(Bitmap bitmap, int width, int height) { try { if (bitmap == null) { return null; } if (bitmap.Width == width && bitmap.Height == height) { return bitmap; } var scaledBitmap = new Bitmap(width, height); using (var g = Graphics.FromImage(scaledBitmap)) { g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(bitmap, 0, 0, width, height); } return scaledBitmap; } catch { return null; } } public static Image ImageRotates(Bitmap Map, double Dou, bool Bol = true) { try { Image Imga1 = new Image(Map); //Image Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol); // Image Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol) 等同于 Image Imga2 = Imga1.Rotate(Dou, new PointF(Imga1.Width / 2, Imga1.Height / 2), Inter.Cubic, new Bgra(255, 255, 255, 255), Bol); return Imga2; } catch { return null; } } /// /// 获取偏移量 通过矩形查找 /// /// /// /// /// /// /// public static float GetPostionXYByFindRoteBmp(Mat color_mat, VectorOfVectorOfPoint selected_contours, string postionCut) { try { CommonUse commonUse = new CommonUse(); string[] postionc = postionCut.Split('^'); Point GrXY; int Y2 = 0, Y1 = 0, X2 = 0, X1 = 0; for (int i = 0; i < postionc.Length; i++) { string[] postCutList = postionc[i].Split(','); int X = Convert.ToInt32(Convert.ToDouble(postCutList[0])); int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1])); int W = Convert.ToInt32(Convert.ToDouble(postCutList[2])); int H = Convert.ToInt32(Convert.ToDouble(postCutList[3])); //commonUse.DrawGridByXY(测试查找坐标.myFrom.PB_guodu, X, W, 1, Y, H, 1);Response.Write(ImgToBase64String(bmp)); string mx = ""; try { mx = commonUse.GetValueAndDrawGrid_Find(color_mat.Bitmap, selected_contours, X, W, 1, Y, H, 1, "", out GrXY); } catch { mx = "null"; GrXY = new Point(0, 0); } if (mx.Trim() != "A") { break; } Point Mx = GrXY; if (i == 0)//左上角 { Y1 = GrXY.Y; X1 = GrXY.X; } if (i == 2)//左下角 { X2 = GrXY.X; Y2 = GrXY.Y; } } return (float)(Math.Atan2((Y2 - Y1), (X2 - X1)) * (180 / Math.PI)); } catch { return -100; } } /// /// 获取偏移量 通过矩形查找 /// /// /// /// /// /// /// public static Image GetPostionXYByFind(Mat color_mat, VectorOfVectorOfPoint selected_contours, string postionCut) { try { CommonUse commonUse = new CommonUse(); string[] postionc = postionCut.Split('^'); string PYPostion = ""; Point GrXY; int PostionWW = 0; int PostionHH = 0; int Y2 = 0, Y1 = 0, X2 = 0, X1 = 0; for (int i = 0; i < postionc.Length; i++) { string[] postCutList = postionc[i].Split(','); int X = Convert.ToInt32(Convert.ToDouble(postCutList[0])); int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1])); int W = Convert.ToInt32(Convert.ToDouble(postCutList[2])); int H = Convert.ToInt32(Convert.ToDouble(postCutList[3])); string mx = ""; try { mx = commonUse.GetValueAndDrawGrid_Find(color_mat.Bitmap, selected_contours, X, W, 1, Y, H, 1, "", out GrXY); } catch { mx = "null"; GrXY = new Point(0, 0); } if (mx.Trim() != "A") { break; } Point Mx = GrXY; if (i == 0)//左上角 { PYPostion = GrXY.X + "," + GrXY.Y; Y1 = GrXY.Y; X1 = GrXY.X; } if (i == 1)//右上角 { PostionWW = GrXY.X; } if (i == 2)//左下角 { PostionHH = GrXY.Y; X2 = GrXY.X; Y2 = GrXY.Y; } } string[] posList = PYPostion.Split(','); int PostionX = Convert.ToInt32(posList[0]); int PostionY = Convert.ToInt32(posList[1]); int PostionW = PostionWW - PostionX; int PostionH = PostionHH - PostionY; //裁剪 Rectangle rectangle = new Rectangle(PostionX, PostionY, PostionW, PostionH); Image Sub = new Image(color_mat.Bitmap).GetSubRect(rectangle); Image CropImage = new Image(Sub.Size); CvInvoke.cvCopy(Sub, CropImage, IntPtr.Zero); //获取偏移量 return CropImage; } catch { return null; } } /// /// 获取裁剪 L T W H /// /// public static Image GetMatCutImg(Bitmap bmp, int sX, int sT, int sW, int sH) { List> postionimageCut = new List>(); int L = sX; int T = sT; int W = sW; int H = sH; Rectangle rectangle = new Rectangle(L, T, W, H); Image Sub = new Image(bmp).GetSubRect(rectangle); Image CropImage = new Image(Sub.Size); CvInvoke.cvCopy(Sub, CropImage, IntPtr.Zero); return CropImage; } /// /// 获取主观题 /// /// /// /// /// public static List GetZhuguantiText(Mat color_mat, string[] PYPostion, string postiontiaomaX, int pageIndex) { string[] Datalist = postiontiaomaX.Split('^'); List lt = new List(); CommonUse commonUse = new CommonUse(); foreach (string postiontiaoma in Datalist) { ZhuguantiList zd = new ZhuguantiList(); string[] tiaomaData = postiontiaoma.Split(','); int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]); int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ; int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2])); int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3])); Image bytimg = GetMatCutImg(color_mat.Bitmap, X, Y, W, H); zd.btm = new Bitmap(bytimg.Bitmap); zd.num = tiaomaData[4]; zd.QuestionSmallNum = Convert.ToInt32(tiaomaData[5]); lt.Add(zd); bytimg.Bitmap.Dispose(); } return lt; } public static Bitmap GetDrawRectangleWhite(Bitmap bit) { Bitmap bmp = new Bitmap(bit); float w = (float)(2);//边框的宽度,可取任意值 using (Graphics g = Graphics.FromImage(bmp)) { // g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);//抓取背景图 using (Pen pen = new Pen(Color.White, w)) { g.DrawRectangle(pen, new Rectangle(0, 0, Math.Abs(bmp.Width), Math.Abs(bmp.Height)));//加边框 g.Dispose(); } } return bmp; } }