ตัวอย่าง Code เพื่อสร้างภาพ Thumbnail ของเวบไซต์ที่ต้องการ โดยสามารถกำหนดความกว้าง สูง ได้เองผ่าน Parameter ขั้นตอนการสร้าง ดังนี้
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;
}