C# System.Drawing Graphics 画图

来源:互联网 发布:linux进程与线程的区别 编辑:程序博客网 时间:2024/04/27 19:13

 

 

        串的参数无所谓主要看画图的那一块的处理,还有看这个引擎的指针如何画

 

       /// <summary>
        /// 保存生成的图片到指定的目录下
        /// </summary>
        /// <param name="dataSum"></param>
        /// <param name="SCE"></param>
        /// <param name="Cdinators"></param>
        private void SavePicToFolder(List<int> dataSum, SysConfEntity SCE, List<Coordinator> Cdinators)

 {
            try
            {
                if (dataSum != null && Cdinators != null)
                {
                    int posX, posY; //坐标
                    posX = (int)(int.Parse(SCE.PicWidth) / 2 - int.Parse(SCE.PicHeight) / 2);     
                    posY = 0;

                    Bitmap objBmp = new Bitmap(int.Parse(SCE.PicWidth), int.Parse(SCE.PicHeight));
                    Graphics objgraphics = Graphics.FromImage(objBmp);
                    objgraphics.Clear(Color.White);

                    objgraphics.DrawImage(CreatePicFirst(dataSum, SCE, Cdinators), posX, posY);
                    //objgraphics.Dispose();
                    string FileName = SCE.PicSaveUrl + @"\EnginePic1.jpg";
                    objBmp.Save(FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //objBmp.Dispose();

                    objgraphics.DrawImage(CreatePicSecend(dataSum, SCE, Cdinators), posX, posY);
                    //objgraphics.Dispose();
                    FileName = SCE.PicSaveUrl + @"\EnginePic2.jpg";
                    objBmp.Save(FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //objBmp.Dispose();

                    objgraphics.DrawImage(CreatePicThird(dataSum, SCE, Cdinators), posX, posY);
                    //objgraphics.Dispose();
                    FileName = SCE.PicSaveUrl + @"\EnginePic3.jpg";
                    objBmp.Save(FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //objBmp.Dispose();


                    objgraphics.DrawImage(CreateEnginePic(dataSum, SCE, Cdinators), posX, posY);
                    objgraphics.Dispose();//释放graphic对象
                    FileName = SCE.PicSaveUrl + @"\EnginePic.jpg";
                    objBmp.Save(FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    objBmp.Dispose();//释放bitmap对象
                }
            }
            catch (Exception err)
            {
                //MessageBox.Show("保存图盘时错误(请确认存储路径是否设置正确,是否需要特殊权限才能保存)!错误原因:" + err.Message, "提示信息",
                //          MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Application.Exit();
            }
        }

 

 #region "生成第二张图片"
        /// <summary>
        /// 生成第二张图片
        /// </summary>
        /// <param name="dataSum"></param>
        /// <param name="SCE"></param>
        /// <param name="Cdinators"></param>
        /// <returns></returns>
        private Bitmap CreatePicSecend(List<int> dataSum, SysConfEntity SCE, List<Coordinator> Cdinators)
        {
            try
            {
                int posX = 0, poxY = 0;//用于定位图片元素的位置
                int[] engRan = new int[4];
                int EngSum = 0;
                double showEngSum = 0.0;
                string EngName;
                string FontName;
                string FontSize;
                //想设置一个正方形的画布,边长是要求矩形图片短边长度
                int picBoderLength = 1;
                if (int.Parse(SCE.PicHeight) < int.Parse(SCE.PicWidth))
                {
                    picBoderLength = int.Parse(SCE.PicHeight);
                }
                else
                {
                    picBoderLength = int.Parse(SCE.PicWidth);
                }


                Bitmap objbitmap = new Bitmap(picBoderLength, picBoderLength);
                Graphics objgraphics = Graphics.FromImage(objbitmap);
                objgraphics.Clear(Color.White);
                objgraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//指定消除锯齿呈现
                objgraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//文本优化
                //生成图片的上半部分,因为这三张图片通用的,可以提出一个方法
                objgraphics.DrawImage(GetHeadBmp(dataSum, SCE, Cdinators, picBoderLength), posX, poxY);

                //生成图片的引擎部分
                if (dataSum != null)
                {
                    EngSum = dataSum[2];
                    showEngSum = EngSum / 10000.0;
                    EngSum = EngSum / 10000;
                }
                else
                {
                    showEngSum = 0.0;
                }
                EngName = SCE.Eng3Name;
                FontName = SCE.fontname;
                FontSize = SCE.fontsize;
                engRan[0] = int.Parse(SCE.Eng3BlueST);
                engRan[1] = int.Parse(SCE.Eng3YellowST);
                engRan[2] = int.Parse(SCE.Eng3RedST);
                engRan[3] = int.Parse(SCE.Eng3RedED);

                //生成引擎图片
                posX = (int)(picBoderLength * 0.14);
                poxY = (int)(picBoderLength * 0.56);

                Bitmap bmpEngine = new Bitmap(Image.FromFile(Application.StartupPath + @"..\..\..\Images\engyellow.png"), new Size((int)(picBoderLength * 0.72), (int)(picBoderLength * 0.36)));
                objgraphics.DrawImage(bmpEngine, posX, poxY);

                //生成指针
                posX = (int)(picBoderLength * 0.48);
                poxY = (int)(picBoderLength * 0.86);

                SolidBrush penbrush = new SolidBrush(Color.Black);
                Pen pen = new Pen(Brushes.Black, 3);
                Rectangle rect = new Rectangle(posX, poxY, (int)(picBoderLength * 0.04), (int)(picBoderLength * 0.04));
                objgraphics.DrawEllipse(pen, rect);
                objgraphics.FillEllipse(penbrush, rect);

                int px0, py0, px1, py1, length, mrad;
                mrad = 0;//角度
                //****************计算指针的角度***************************
                if (EngSum < engRan[1])
                {
                    mrad = (int)(135 + 45 * (1 - EngSum * 1.0 / engRan[1]));
                }
                else if ((EngSum >= engRan[1]) && (EngSum < engRan[2]))
                {
                    mrad = (int)(50 + 85 * (1 - (EngSum * 1.0 - engRan[1]) / (engRan[2] - engRan[1])));
                }
                else if ((EngSum >= engRan[2]) && (EngSum <= engRan[3]))
                {
                    mrad = (int)(50 * (1 - (EngSum * 1.0 - engRan[2]) / (engRan[3] - engRan[2])));
                }
                else
                {
                    mrad = 0;
                }
                //*********************************************************
                length = (int)(picBoderLength * 0.28);//指针长度
                px0 = (int)(picBoderLength * 0.5);//起始点x坐标
                py0 = (int)(picBoderLength * 0.88);//起始点y坐标
                px1 = px0 + (int)(length * Math.Cos(mrad * Math.PI / 180));//终止点x坐标
                py1 = py0 - (int)(length * Math.Sin(mrad * Math.PI / 180));//终止点y坐标
                Pen penL = new Pen(Brushes.Black, (int)(picBoderLength * 0.02));//指针宽度
                objgraphics.DrawLine(penL, px0, py0, px1, py1);

                posX = (int)(picBoderLength * 0.19);
                poxY = (int)(picBoderLength * 0.5);
                objgraphics.DrawString(EngName, new Font(FontName, (float)(int.Parse(FontSize)), FontStyle.Bold), Brushes.Red, posX, poxY);

                string showEngNum = showEngSum.ToString("F1");
                int numlengthnum = showEngNum.Length;
                if (numlengthnum == 6)             // 这一块主要是数字的位数不一定,没办法确定那个位置合适  因为这个项目最多6位 我就这样简单的处理了
                {
                    posX = (int)(picBoderLength * 0.325);
                    poxY = (int)(picBoderLength * 0.91);
                    //showEngSum.ToString("F1")
                    objgraphics.DrawString(showEngNum, new Font(FontName, (float)(int.Parse(FontSize) * 1.45), FontStyle.Bold), Brushes.Black, posX, poxY);

                    posX = (int)(picBoderLength * 0.56);
                    poxY = (int)(picBoderLength * 0.93);
                    objgraphics.DrawString("万米", new Font(FontName, (float)(int.Parse(FontSize) * 0.9), FontStyle.Bold), Brushes.Black, posX, poxY);
                }
                else if (numlengthnum == 5)
                {
                    posX = (int)(picBoderLength * 0.34);
                    poxY = (int)(picBoderLength * 0.91);
                    //showEngSum.ToString("F1")
                    objgraphics.DrawString(showEngNum, new Font(FontName, (float)(int.Parse(FontSize) * 1.45), FontStyle.Bold), Brushes.Black, posX, poxY);

                    posX = (int)(picBoderLength * 0.54);
                    poxY = (int)(picBoderLength * 0.93);
                    objgraphics.DrawString("万米", new Font(FontName, (float)(int.Parse(FontSize) * 0.9), FontStyle.Bold), Brushes.Black, posX, poxY);
                }
                else if (numlengthnum == 4)
                {
                    posX = (int)(picBoderLength * 0.355);
                    poxY = (int)(picBoderLength * 0.91);
                    //showEngSum.ToString("F1")
                    objgraphics.DrawString(showEngNum, new Font(FontName, (float)(int.Parse(FontSize) * 1.45), FontStyle.Bold), Brushes.Black, posX, poxY);

                    posX = (int)(picBoderLength * 0.515);
                    poxY = (int)(picBoderLength * 0.93);
                    objgraphics.DrawString("万米", new Font(FontName, (float)(int.Parse(FontSize) * 0.9), FontStyle.Bold), Brushes.Black, posX, poxY);
                }
                else
                {
                    posX = (int)(picBoderLength * 0.38);
                    poxY = (int)(picBoderLength * 0.91);
                    //showEngSum.ToString("F1")
                    objgraphics.DrawString(showEngNum, new Font(FontName, (float)(int.Parse(FontSize) * 1.45), FontStyle.Bold), Brushes.Black, posX, poxY);

                    posX = (int)(picBoderLength * 0.5);
                    poxY = (int)(picBoderLength * 0.93);
                    objgraphics.DrawString("万米", new Font(FontName, (float)(int.Parse(FontSize) * 0.9), FontStyle.Bold), Brushes.Black, posX, poxY);
                }


                posX = (int)(picBoderLength * 0.13);
                poxY = (int)(picBoderLength * 0.86);
                objgraphics.DrawString(engRan[0].ToString(), new Font(FontName, (float)(int.Parse(FontSize)), FontStyle.Bold), Brushes.Black, posX, poxY);

                posX = (int)(picBoderLength * 0.19);
                poxY = (int)(picBoderLength * 0.61);
                objgraphics.DrawString(engRan[1].ToString(), new Font(FontName, (float)(int.Parse(FontSize)), FontStyle.Bold), Brushes.Black, posX, poxY);

                posX = (int)(picBoderLength * 0.71);
                poxY = (int)(picBoderLength * 0.61);
                objgraphics.DrawString(engRan[2].ToString(), new Font(FontName, (float)(int.Parse(FontSize)), FontStyle.Bold), Brushes.Black, posX, poxY);

                posX = (int)(picBoderLength * 0.83);
                poxY = (int)(picBoderLength * 0.86);
                objgraphics.DrawString(engRan[3].ToString(), new Font(FontName, (float)(int.Parse(FontSize)), FontStyle.Bold), Brushes.Black, posX, poxY);

                posX = (int)(picBoderLength * 0.67);
                poxY = (int)(picBoderLength * 0.89);
                objgraphics.DrawString("单位:万米", new Font(FontName, (float)(int.Parse(FontSize) * 0.6), FontStyle.Bold), Brushes.Red, posX, poxY);

                objgraphics.Dispose();
                return objbitmap;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("生成第二张图象失败:" + ex.Message + "请联系管理员!", "提示",
                //   MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Application.Exit();
                return null;
            }
        }
        #endregion

 

0 0
原创粉丝点击