最近開始學習影像處理這一塊了,學一點就記錄一點,等寫完也出了一個小軟體了~
這裡的是:繪製公章。
#region 繪製公章 private void simpleButton_繪製公章_Click(object sender, EventArgs e) { int tem_Line = 0; //圓的直徑 int circularity_W = 5; //畫筆的粗細 string star_Str = "★"; //星星 Font star_Font = new Font("Arial", 30, FontStyle.Regular);//設定星號的字型樣式 #region 畫圓 if (panel_繪製公章.Height > panel_繪製公章.Width) //如果panel控制項的高度大於等於寬度 { tem_Line = panel_繪製公章.Width; //設定寬度為圓的直徑 } else { tem_Line = panel_繪製公章.Height; //設定高度為圓的直徑 } //設定圓的繪製地區=>現在是正方形的地區 rect = new Rectangle(circularity_W, circularity_W, tem_Line - 2 * circularity_W, tem_Line - 2 * circularity_W); //補充:Graphics必須有載體,也就是在哪裡繪 //所以必須是this.CreateGraphics或者Panel..CreateGraphics等格式 Graphics g = panel_繪製公章.CreateGraphics();//執行個體化Graphics類 //消除繪製圖形的鋸齒 g.SmoothingMode = SmoothingMode.AntiAlias; //System.Drawing.Drawing2D; g.Clear(Color.White); //以白色清空panel1控制項的背景,防止重複畫 Pen myPen = new Pen(Color.Red, circularity_W); //設定畫筆(顏色和粗細) g.DrawEllipse(myPen, rect); //繪製圓 #endregion #region 畫星星 SizeF Var_Size = new SizeF(rect.Width, rect.Height); //執行個體化SizeF類 Var_Size = g.MeasureString(star_Str, star_Font); //對指定字串進行測量 //正中間的位置繪製星號 float star_x = (rect.Width / 2F) + circularity_W - Var_Size.Width / 2F; float star_y = rect.Height / 2F - Var_Size.Width / 2F; g.DrawString(star_Str, star_Font, myPen.Brush, new PointF(star_x, star_y)); #endregion #region 畫文字 Var_Size = g.MeasureString("本人專用章", Var_Font);//對指定字串進行測量 //繪製文字:在中間,但是在星星下面 float m = (rect.Width / 2F) + circularity_W - Var_Size.Width / 2F; float n = rect.Height / 2F + Var_Size.Height * 2; g.DrawString("本人專用章", Var_Font, myPen.Brush, new PointF(m, n)); int len = 0; if (inputWords != null) //如果沒有輸入文字,加判斷 { len = inputWords.Length;//擷取字串的長度 } float angle = 180;//設定文字的初始旋轉角度 float change = 0; if (len > 1) //一個字的需要特殊處理 { change = 180 / (len - 1); } for (int i = 0; i < len; i++)//將文字以指定的弧度進行繪製 { if (len > 1) { //相當於把座標系移動到了正中間 float x = (tem_Line + circularity_W / 2) / 2; float y = (tem_Line + circularity_W / 2) / 2; //將指定的平移添加到g的變換矩陣前 g.TranslateTransform(x, y); g.RotateTransform(angle);//將指定的旋轉用於g的變換矩陣 Brush myBrush = Brushes.Red;//定義畫刷 //需要注意,這時文字的位置的座標位置是以新的座標係為基礎得到的 float words_x = tem_Line / 2 - 6 * circularity_W; float words_y = 0; g.DrawString(inputWords.Substring(i, 1), Var_Font, myBrush, words_x, words_y);//顯示旋轉文字 g.ResetTransform();//將g的全域變換矩陣重設為單位矩陣=>對應TranslateTransform,相當於恢複操作 angle += change;//設定下一個文字的角度 } else { //輸入的文字為一個時候是特殊情況,單獨考慮 float x = (tem_Line + circularity_W / 2) / 2; float y = (tem_Line + circularity_W / 2) / 2; g.TranslateTransform(x, y); g.RotateTransform(0); Brush myBrush = Brushes.Red; float words_x = -circularity_W*3; float words_y = -(tem_Line / 2 - 2 * circularity_W); g.DrawString(inputWords.Substring(i, 1), Var_Font, myBrush, words_x, words_y); g.ResetTransform(); } } #endregion } private void simpleButton2_Click(object sender, EventArgs e) { inputWords = textBox_文字.Text; MessageBox.Show("儲存成功!"); }#endregion
效果預覽圖: