我們在做web程式的時候經常會遇到一些圖片處理的問題,今天就把遇到的需要圖片處理的地方給總結一下。也算是對自己學習過程的一個總結,希望也能給大家一些啟發。
一、驗證碼。
我們在某些網站註冊或者登入的時候,都可能遇到要填寫驗證碼的地方,當時沒搞懂這樣的圖片是怎樣一回事,事實上這是一張隨機產生的圖片,需要在後台專門建立一個aspx頁或者ashx一般程式處理頁來專門負責產生這樣的圖片。下面就通過樣本向大家示範這樣的一個過程!
首先我們建立一個登入頁,類比使用者登入。代碼如下:
<div> <table> <tr><td>帳號:</td><td> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td></tr> <tr><td>密碼:</td><td> <asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox></td></tr> <tr><td>驗證碼:</td><td> <asp:Image ID="Image1" runat="server" ImageUrl="ValidateNo.aspx" /></td></tr> <tr><td>請輸入:</td><td> <asp:TextBox ID="txtyzm" runat="server"></asp:TextBox></td></tr> <tr><td> <asp:Button ID="btndl" runat="server" Text="登入" onclick="btndl_Click" /></td><td> <asp:Button ID="Button2" runat="server" Text="取消" CausesValidation=false /></td></tr> </table> </div>
布局如圖:
然後再建立一個ValidateNo.aspx頁,用來產生驗證碼圖片,在這個aspx頁中只需要在建構函式中寫如下代碼即可:
protected void Page_Load(object sender, EventArgs e) { Random r = new Random(); int i = r.Next(1000, 9999);//產生一個四位的隨機數 Bitmap bit = new Bitmap(100, 40);//產生一個尺寸為100,40的位元影像 Graphics g = Graphics.FromImage(bit);//建立一個繪圖執行個體,並以上邊建立的的位元影像為畫板,當然這裡邊也以選擇一張已有的圖片作為畫板。只需要將FromImage()裡的參數換位已存在的Image對象即可 g.DrawLine(new Pen(Brushes.Blue), new Point(0, 10), new Point(100, 10)); g.DrawLine(new Pen(Brushes.GreenYellow), new Point(0, 25), new Point(100, 25));//畫兩條直線,起到一定的模糊驗證的碼的效果 g.DrawString(i.ToString(), new Font("宋體", 30), Brushes.Green, new PointF(0, 0));//將產生的四位元的驗證碼繪到該畫板上 bit.Save(Response.OutputStream, ImageFormat.Jpeg);//將該位元影像儲存為JPEG的格式 Session["ValidateNo"] = i.ToString();//Seession值儲存產生的驗證碼的值,以便在登入的時候和使用者輸入的驗證碼的值做比較 Response.ContentType = "image/jpeg";//將輸入類型改為“Image/jpeg" Response.End(); }
剛剛我們在代碼裡有說到將產生的隨機驗證碼儲存在seesion中,那麼我們在登入的時候就可以根據session中值的和使用者輸入的值做比較,以此來判斷使用者輸入驗證碼是否正確,所以我們在登入頁的aspx.cs頁做出這樣的處理:(這裡只是類比測試,在實際的開發中,如果驗證碼、密碼、帳號都正確的話,就會導向新的頁面)
protected void btndl_Click(object sender, EventArgs e) { if (Session["ValidateNo"] != null) { string s = Session["ValidateNo"].ToString(); if (txtyzm.Text != s) { Response.Write("<script>alert('"+s+"')</script>"); } else { Response.Write("<script>alert('OK')</script>"); } } else { Response.Write("<script>alert('驗證碼暫不存在!')</script>"); } }
二、給圖片加文字
有時候我們會看到有些個人空間或首頁的圖片都加有相應的文字,就像騰訊微博那種發一張圖片會顯示騰訊微博字樣。下面我就給大家展示下如何在圖片上添加文字。
首先我們建立一個aspx頁,頁面配置如下:
<table style="background:lightblue"><tr><td>選擇上傳檔案:</td><td><asp:FileUpload ID="FileUpload1" runat="server" /></td><td> <asp:Button ID="btnupload" runat="server" Text="上傳圖片" onclick="btnupload_Click" /></td></tr> <tr><td colspan="3"> <asp:Image ID="TouXiang" runat="server" /></tr> </table> 然後我們在btnuplod按鈕的Click事件的處理函數中做如下操作: protected void btnupload_Click(object sender, EventArgs e) { if (FileUpload1.FileName.Trim() != "") { string extension = Path.GetExtension(FileUpload1.FileName);//先擷取檔案的尾碼 string fileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Minute.ToString();//以當前的日期,以年月分的格式為上傳的圖片重新命名 string path = Server.MapPath(".")+"\\images\\"+fileName + extension; FileUpload1.PostedFile.SaveAs(path);//將圖片儲存在指定路徑下 Bitmap img = new Bitmap(path);//建立一個Bitmap對象並以此為畫板 Graphics g = Graphics.FromImage(img); g.DrawString("Hello Olive!", new Font("宋體", 30), Brushes.GreenYellow, new PointF(20,20) );//將"Hello Olive"書寫在圖片的(20,20)處 g.Dispose(); newPath = Server.MapPath(".") + "\\images\\" + fileName + "_New" + extension; img.Save(newPath);//將加有文字的圖片重新命名並儲存,並刪除原來的圖片 img.Dispose(); if (File.Exists(path)) { File.Delete(path); } touxiangpath="~/images/" + fileName + "_New" + extension; } else { Response.Write("<script>alert('請先選擇要上傳的檔案!')</script>"); } }
效果如圖:
三、產生略縮圖
現在的很多部落格、個人首頁、空間之類的都有編輯個人資訊的設定,在編輯個人資訊的時候都可能會需要上傳頭像,下面我們來講一下如何產生略縮頭像。
頁面配置的話我們還是引用上邊的布局:
但是要在<table></table>再加一行,用來顯示產生的略縮圖。
首先我們需要建立一個CutImage類CutImage.cs,專門用來對圖片進行縮放,如下:
/// <summary>(該圖片縮放的代碼參考自部落格園博主king-兩色天)
/// 截取圖片
/// </summary>
/// <param name="oPath">原圖片路徑</param>
/// <param name="nPaht">新圖片路徑</param>
/// <param name="w">略縮圖的寬度</param>
/// <param name="h">略縮圖的高度</param>
/// <param name="mode">截模數式</param>
代碼:
public static void CutImg(string oPath, string nPaht, int w, int h,string mode) { Image oimg = Image.FromFile(oPath); int nToWidth = w; int nToHeight = h; int x = 0; int y = 0; int oWidth = oimg.Width; int oHeight = oimg.Height; switch (mode) { case "HW"://按照指定的寬高進行縮放,可能變形 break; case "W"://指定寬度,高按比例縮放 nToHeight = oWidth * oHeight / nToWidth; break; case "H"://指定高度,寬按比例縮放 nToWidth=oWidth*oHeight/nToHeight; break; case "CUT"://按照指定的寬、高縮放 if ((oimg.Width / oimg.Height) > (nToWidth / nToHeight)) { oHeight = oimg.Height; oWidth = oimg.Height * nToWidth / nToHeight; y = 0; x = (oimg.Width - oWidth) / 2; } else { oWidth = oimg.Width; oHeight = oimg.Width * nToHeight / nToWidth; x = 0; y = (oimg.Height - oHeight) / 2; } break; default: break; } //建立一個BMP圖片 Image bitmap = new Bitmap(nToWidth, nToHeight); //建立一個畫板 Graphics gp = Graphics.FromImage(bitmap); gp.InterpolationMode = InterpolationMode.High; gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空畫布,並以背景色為透明色填充 gp.Clear(Color.Transparent); gp.DrawImage(oimg, new Rectangle(0, 0, nToWidth, nToHeight), new Rectangle(x, y, oWidth, oHeight), GraphicsUnit.Pixel);//繪製出新的略縮圖 try { bitmap.Save(nPaht, System.Drawing.Imaging.ImageFormat.Jpeg); } catch(Exception e) { throw e; } finally { oimg.Dispose(); bitmap.Dispose(); } }
然後我們的aspx頁的btnupload按鈕的Click事件的處理函數代碼如下:
protected void btnupload_Click(object sender, EventArgs e) { if (FileUpload1.FileName.Trim() != "") { //....... //.......前邊都省略了代碼是一樣的 if (File.Exists(path)) { File.Delete(path); } string p = Server.MapPath(".") + "\\images\\"; touxiangpath="~/images/" + fileName + "_New" + extension; TouXiang.ImageUrl = touxiangpath; CutImage.CutImg(newPath, p+"olive.jpg", 100, 200, "CUT");//調用縮放圖片的類CutImage的CutImg函數,這裡直接儲存為了“olive.jpg"是為了方便下面的引用顯示,也可儲存為其他的名稱和格式。 luesuotu.ImageUrl = "~/images/olive.jpg"; } else { Response.Write("<script>alert('請先選擇要上傳的檔案!')</script>"); } }
產生效果如圖:
為了方便大家的使用我已經把圖片縮放功能封裝成了一個類,裡邊還有其他的一些縮放的功能,已經匯出了類模板,有興趣的朋友可以點擊下載ImageCut.zip,希望可以給大家一些協助。