1.สร้าง Class ชื่อ ClassWSThumb เพื่อจัดการในส่วนของการสร้างภาพ Thumbnail รวมถึงการแสดงผลของภาพ เช่น ขนาดความกว้าง สูง ของ ภาพที่ทำการ Capture , ขนาดความกว้าง สูง ของ thumbnail ตาม Code นี้
using System; using System.Drawing; using System.Windows.Forms; using System.Threading; using System.IO; public class ClassWSThumb { public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight) { return new WSThumb(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight).GetWSThumb(); } private class WSThumb { public WSThumb(string Url, int BW, int BH, int TW, int TH) { __Url = Url; __BrowserWidth = BW; __BrowserHeight = BH; __ThumbnailWidth = TW; __ThumbnailHeight = TH; } private Bitmap __Bitmap = null; private string __Url = null; private int __ThumbnailWidth; private int __ThumbnailHeight; private int __BrowserWidth; private int __BrowserHeight; public string Url { get { return __Url; } set { __Url = value; } } public Bitmap ThumbnailImage { get { return __Bitmap; } } public int ThumbnailWidth { get { return __ThumbnailWidth; } set { __ThumbnailWidth = value; } } public int ThumbnailHeight { get { return __ThumbnailHeight; } set { __ThumbnailHeight = value; } } public int BrowserWidth { get { return __BrowserWidth; } set { __BrowserWidth = value; } } public int BrowserHeight { get { return __BrowserHeight; } set { __BrowserHeight = value; } } public Bitmap GetWSThumb() { ThreadStart __threadStart = new ThreadStart(_GenerateWSThumb); Thread __thread = new Thread(__threadStart); __thread.SetApartmentState(ApartmentState.STA); __thread.Start(); __thread.Join(); return __Bitmap; } private void _GenerateWSThumb() { WebBrowser __WebBrowser = new WebBrowser(); __WebBrowser.ScrollBarsEnabled = false; __WebBrowser.Navigate(__Url); __WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); while (__WebBrowser.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); __WebBrowser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser __WebBrowser = (WebBrowser)sender; __WebBrowser.ClientSize = new Size(this.__BrowserWidth, this.__BrowserHeight); __WebBrowser.ScrollBarsEnabled = false; __Bitmap = new Bitmap(__WebBrowser.Bounds.Width, __WebBrowser.Bounds.Height); __WebBrowser.BringToFront(); __WebBrowser.DrawToBitmap(__Bitmap, __WebBrowser.Bounds); if (__ThumbnailHeight != 0 && __ThumbnailWidth != 0) __Bitmap = (Bitmap)__Bitmap.GetThumbnailImage( __ThumbnailWidth, __ThumbnailHeight, null, IntPtr.Zero); } } }
2.สร้างไฟล์ Generic Handler (*.ashx) สำหรับทำหน้าที่รับ Request มาดำเนินการ Process งาน เมื่อเสร็จแล้วก็จะส่ง Response กลับไป ดังนั้นจึงเหมาะกับการทำงานที่มี Process ไม่เยอะ เช่น Upload, Download หรือการรับ AJAX Request ในที่นี้ตั้งชื่อไฟล์ว่า HandlerWSThumb.ashx ตัวอย่าง Code ดังนี้
using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; using System.Threading; using System.IO; using System.Reflection; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class HandlerWSThumb : IHttpHandler { public void ProcessRequest(HttpContext context) { Bitmap thumb = null; string url = null; int bw = 800; // ความกว้างของ Border int bh = 600; // ความสูงของ Border int tw = 0; // ความกว้างของ Thumbnail int th = 0; // ความสูงของ Thumbnail // กำหนดประเภทของไฟล์ สามารถกำหนดเป็นประเภทอื่นได้ context.Response.ContentType = "image/jpeg"; if (context.Request["url"] != null) { if (context.Request["url"].ToString().ToLower().Contains("http://") || context.Request["url"].ToString().ToLower().Contains("https://")) url = context.Request["url"].ToString(); else url = "http://" + context.Request["url"].ToString(); } if (context.Request["bw"] != null) bw = Int32.Parse(context.Request["bw"].ToString()); if (context.Request["bh"] != null) bh = Int32.Parse(context.Request["bh"].ToString()); if (context.Request["tw"] != null) tw = Int32.Parse(context.Request["tw"].ToString()); if (context.Request["th"] != null) th = Int32.Parse(context.Request["th"].ToString()); // return context bitmap thumb = GetWebSiteThumbnail(url, bw, bh); if (tw != 0 && th != 0) thumb.GetThumbnailImage(tw, th, null, IntPtr.Zero).Save( context.Response.OutputStream, ImageFormat.Jpeg); else thumb.Save(context.Response.OutputStream, ImageFormat.Jpeg); thumb.Dispose(); } public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight) { WebsiteThumbnailImage thumbnailGenerator = new WebsiteThumbnailImage(Url, BrowserWidth, BrowserHeight); return thumbnailGenerator.GenerateWebSiteThumbnailImage(); } private class WebsiteThumbnailImage { public WebsiteThumbnailImage(string Url, int BrowserWidth, int BrowserHeight) { this.m_Url = Url; this.m_BrowserWidth = BrowserWidth; this.m_BrowserHeight = BrowserHeight; } private string m_Url = null; public string Url { get { return m_Url; } set { m_Url = value; } } private Bitmap m_Bitmap = null; public Bitmap ThumbnailImage { get { return m_Bitmap; } } private int m_BrowserWidth; public int BrowserWidth { get { return m_BrowserWidth; } set { m_BrowserWidth = value; } } private int m_BrowserHeight; public int BrowserHeight { get { return m_BrowserHeight; } set { m_BrowserHeight = value; } } public Bitmap GenerateWebSiteThumbnailImage() { Thread m_thread = new Thread(new ThreadStart(_GenerateWebSiteThumbnailImage)); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } private void _GenerateWebSiteThumbnailImage() { WebBrowser m_WebBrowser = new WebBrowser(); m_WebBrowser.ScrollBarsEnabled = false; m_WebBrowser.Navigate(m_Url); m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler( WebBrowser_DocumentCompleted); while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); m_WebBrowser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser m_WebBrowser = (WebBrowser)sender; m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight); m_WebBrowser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height); m_WebBrowser.BringToFront(); m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds); //m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage( // m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero); } } // Resusable flag public bool IsReusable { get { return false; } } }
3.จากนั้น สามารถเรียกใช้งานโดย Class จะทำหน้าที่จัดการรูปภาพ แล้วคืนออกมาเป็น ImagePath ในที่นี้ยกตัวอย่างสร้าง Method เพื่อ Generate Path ของรูปภาพที่ดึงข้อมูลได้
public string CreateThumbnailPath(string pURL , string pBorderWidth , string pBorderHeight , string pThumbBorder , string pThumbHeight) { string path = null; try { path = string.Format("~/HandlerWSThumb.ashx?url={0}&bw={1}&bh={2}&tw={3}&th={4}" , pURL.ToString() , pBorderWidth // ความกว้างของ Border , pBorderHeight // ความสูงของ Border , pThumbBorder // ความกว้างของ Thumbnail , pThumbHeight); // ความสูงของ Thumbnail } catch (Exception ex) { } return path; }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น