c# 實現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片
更新時間:2021年01月13日 10:56:39 作者:UP技術(shù)控
這篇文章主要介紹了c# 實現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片的方法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
背景
最近再做一個需求,需要對網(wǎng)頁生成預(yù)覽圖,如下圖
但是網(wǎng)頁千千萬,總不能一個個打開,截圖吧;于是想著能不能使用代碼來實現(xiàn)網(wǎng)頁的截圖。其實要實現(xiàn)這個功能,無非就是要么實現(xiàn)一個仿真瀏覽器,要么調(diào)用系統(tǒng)瀏覽器,再進行截圖操作。
代碼實現(xiàn)
1、啟用線程Thread
void startPrintScreen(ScreenShotParam requestParam) { Thread thread = new Thread(new ParameterizedThreadStart(do_PrintScreen)); thread.SetApartmentState(ApartmentState.STA); thread.Start(requestParam); if (requestParam.Wait) { thread.Join(); FileInfo result = new FileInfo(requestParam.SavePath); long minSize = 1 * 1024;// 太小可能是空白圖,重抓 int maxRepeat = 2; while ((!result.Exists || result.Length <= minSize) && maxRepeat > 0) { thread = new Thread(new ParameterizedThreadStart(do_PrintScreen)); thread.SetApartmentState(ApartmentState.STA); thread.Start(requestParam); thread.Join(); maxRepeat--; } } }
2、模擬瀏覽器WebBrowser
void do_PrintScreen(object param) { try { ScreenShotParam screenShotParam = (ScreenShotParam)param; string requestUrl = screenShotParam.Url; string savePath = screenShotParam.SavePath; WebBrowser wb = new WebBrowser(); wb.ScrollBarsEnabled = false; wb.ScriptErrorsSuppressed = true; wb.Navigate(requestUrl); logger.Debug("wb.Navigate"); DateTime startTime = DateTime.Now; TimeSpan waitTime = new TimeSpan(0, 0, 0, 10, 0);// 10 second while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); if (DateTime.Now - startTime > waitTime) { wb.Dispose(); logger.Debug("wb.Dispose() timeout"); return; } } wb.Width = screenShotParam.Left + screenShotParam.Width + screenShotParam.Left; // wb.Document.Body.ScrollRectangle.Width (避掉左右側(cè)的邊線); wb.Height = screenShotParam.Top + screenShotParam.Height; // wb.Document.Body.ScrollRectangle.Height; wb.ScrollBarsEnabled = false; wb.Document.Body.Style = "overflow:hidden";//hide scroll bar var doc = (wb.Document.DomDocument) as mshtml.IHTMLDocument2; var style = doc.createStyleSheet("", 0); style.cssText = @"img { border-style: none; }"; Bitmap bitmap = new Bitmap(wb.Width, wb.Height); wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height)); wb.Dispose(); logger.Debug("wb.Dispose()"); bitmap = CutImage(bitmap, new Rectangle(screenShotParam.Left, screenShotParam.Top, screenShotParam.Width, screenShotParam.Height)); bool needResize = screenShotParam.Width > screenShotParam.ResizeMaxWidth || screenShotParam.Height > screenShotParam.ResizeMaxWidth; if (needResize) { double greaterLength = bitmap.Width > bitmap.Height ? bitmap.Width : bitmap.Height; double ratio = screenShotParam.ResizeMaxWidth / greaterLength; bitmap = Resize(bitmap, ratio); } bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Gif); bitmap.Dispose(); logger.Debug("bitmap.Dispose();"); logger.Debug("finish"); } catch (Exception ex) { logger.Info($"exception: {ex.Message}"); } }
3、截圖操作
private static Bitmap CutImage(Bitmap source, Rectangle section) { // An empty bitmap which will hold the cropped image Bitmap bmp = new Bitmap(section.Width, section.Height); //using (Bitmap bmp = new Bitmap(section.Width, section.Height)) { Graphics g = Graphics.FromImage(bmp); // Draw the given area (section) of the source image // at location 0,0 on the empty bitmap (bmp) g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel); return bmp; } } private static Bitmap Resize(Bitmap originImage, Double times) { int width = Convert.ToInt32(originImage.Width * times); int height = Convert.ToInt32(originImage.Height * times); return ResizeProcess(originImage, originImage.Width, originImage.Height, width, height); }
完整代碼
public static string ScreenShotAndSaveAmazonS3(string account, string locale, Guid rule_ID, Guid template_ID) { //新的Template var url = string.Format("https://xxxx/public/previewtemplate?showTemplateName=0&locale={0}&inputTemplateId={1}&inputThemeId=&Account={2}", locale, template_ID, account ); var tempPath = Tools.GetAppSetting("TempPath"); //路徑準(zhǔn)備 var userPath = AmazonS3.GetS3UploadDirectory(account, locale, AmazonS3.S3SubFolder.Template); var fileName = string.Format("{0}.gif", template_ID); var fullFilePath = Path.Combine(userPath.LocalDirectoryPath, fileName); logger.Debug("userPath: {0}, fileName: {1}, fullFilePath: {2}, url:{3}", userPath, fileName, fullFilePath, url); //開始截圖,並暫存在本機 var screen = new Screen(); screen.ScreenShot(url, fullFilePath); //將截圖,儲存到 Amazon S3 //var previewImageUrl = AmazonS3.UploadFile(fullFilePath, userPath.RemotePath + fileName); return string.Empty; }
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace PrintScreen.Common { public class Screen { protected static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public void ScreenShot(string url, string path , int width = 400, int height = 300 , int left = 50, int top = 50 , int resizeMaxWidth = 200, int wait = 1) { if (!string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(path)) { ScreenShotParam requestParam = new ScreenShotParam { Url = url, SavePath = path, Width = width, Height = height, Left = left, Top = top, ResizeMaxWidth = resizeMaxWidth, Wait = wait != 0 }; startPrintScreen(requestParam); } } void startPrintScreen(ScreenShotParam requestParam) { Thread thread = new Thread(new ParameterizedThreadStart(do_PrintScreen)); thread.SetApartmentState(ApartmentState.STA); thread.Start(requestParam); if (requestParam.Wait) { thread.Join(); FileInfo result = new FileInfo(requestParam.SavePath); long minSize = 1 * 1024;// 太小可能是空白圖,重抓 int maxRepeat = 2; while ((!result.Exists || result.Length <= minSize) && maxRepeat > 0) { thread = new Thread(new ParameterizedThreadStart(do_PrintScreen)); thread.SetApartmentState(ApartmentState.STA); thread.Start(requestParam); thread.Join(); maxRepeat--; } } } void do_PrintScreen(object param) { try { ScreenShotParam screenShotParam = (ScreenShotParam)param; string requestUrl = screenShotParam.Url; string savePath = screenShotParam.SavePath; WebBrowser wb = new WebBrowser(); wb.ScrollBarsEnabled = false; wb.ScriptErrorsSuppressed = true; wb.Navigate(requestUrl); logger.Debug("wb.Navigate"); DateTime startTime = DateTime.Now; TimeSpan waitTime = new TimeSpan(0, 0, 0, 10, 0);// 10 second while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); if (DateTime.Now - startTime > waitTime) { wb.Dispose(); logger.Debug("wb.Dispose() timeout"); return; } } wb.Width = screenShotParam.Left + screenShotParam.Width + screenShotParam.Left; // wb.Document.Body.ScrollRectangle.Width (避掉左右側(cè)的邊線); wb.Height = screenShotParam.Top + screenShotParam.Height; // wb.Document.Body.ScrollRectangle.Height; wb.ScrollBarsEnabled = false; wb.Document.Body.Style = "overflow:hidden";//hide scroll bar var doc = (wb.Document.DomDocument) as mshtml.IHTMLDocument2; var style = doc.createStyleSheet("", 0); style.cssText = @"img { border-style: none; }"; Bitmap bitmap = new Bitmap(wb.Width, wb.Height); wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height)); wb.Dispose(); logger.Debug("wb.Dispose()"); bitmap = CutImage(bitmap, new Rectangle(screenShotParam.Left, screenShotParam.Top, screenShotParam.Width, screenShotParam.Height)); bool needResize = screenShotParam.Width > screenShotParam.ResizeMaxWidth || screenShotParam.Height > screenShotParam.ResizeMaxWidth; if (needResize) { double greaterLength = bitmap.Width > bitmap.Height ? bitmap.Width : bitmap.Height; double ratio = screenShotParam.ResizeMaxWidth / greaterLength; bitmap = Resize(bitmap, ratio); } bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Gif); bitmap.Dispose(); logger.Debug("bitmap.Dispose();"); logger.Debug("finish"); } catch (Exception ex) { logger.Info($"exception: {ex.Message}"); } } private static Bitmap CutImage(Bitmap source, Rectangle section) { // An empty bitmap which will hold the cropped image Bitmap bmp = new Bitmap(section.Width, section.Height); //using (Bitmap bmp = new Bitmap(section.Width, section.Height)) { Graphics g = Graphics.FromImage(bmp); // Draw the given area (section) of the source image // at location 0,0 on the empty bitmap (bmp) g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel); return bmp; } } private static Bitmap Resize(Bitmap originImage, Double times) { int width = Convert.ToInt32(originImage.Width * times); int height = Convert.ToInt32(originImage.Height * times); return ResizeProcess(originImage, originImage.Width, originImage.Height, width, height); } private static Bitmap ResizeProcess(Bitmap originImage, int oriwidth, int oriheight, int width, int height) { Bitmap resizedbitmap = new Bitmap(width, height); //using (Bitmap resizedbitmap = new Bitmap(width, height)) { Graphics g = Graphics.FromImage(resizedbitmap); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(Color.Transparent); g.DrawImage(originImage, new Rectangle(0, 0, width, height), new Rectangle(0, 0, oriwidth, oriheight), GraphicsUnit.Pixel); return resizedbitmap; } } } class ScreenShotParam { public string Url { get; set; } public string SavePath { get; set; } public int Width { get; set; } public int Height { get; set; } public int Left { get; set; } public int Top { get; set; } /// <summary> /// 長邊縮到指定長度 /// </summary> public int ResizeMaxWidth { get; set; } public bool Wait { get; set; } } }
效果
以上就是c# 實現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片的詳細(xì)內(nèi)容,更多關(guān)于c# 頁面截取為圖片的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)
- c# WPF中自定義加載時實現(xiàn)帶動畫效果的Form和FormItem
- C# 根據(jù)表格偶數(shù)、奇數(shù)加載不同顏色
- C# 動態(tài)加載程序集信息
- C#中調(diào)用DLL時未能加載文件或程序集錯誤的處理方法(詳解)
- C#中加載dll并調(diào)用其函數(shù)的實現(xiàn)方法
- c# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法
- C#使用Jquery zTree實現(xiàn)樹狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載
- C#使用反射加載多個程序集的實現(xiàn)方法
- C#實現(xiàn)動態(tài)加載dll的方法
- c#動態(tài)加載卸載DLL的方法
- 3種C# 加載Word的方法
相關(guān)文章
c# AcceptEx與完成端口(IOCP)結(jié)合的示例
這篇文章主要介紹了c# AcceptEx與完成端口(IOCP)結(jié)合的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03c# 調(diào)用Surfer軟件,添加引用的具體操作方法
本篇文章主要是對c#中調(diào)用Surfer軟件,添加引用的具體操作方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01c#實現(xiàn)windows遠(yuǎn)程桌面連接程序代碼
本篇文章主要介紹了c#實現(xiàn)windows遠(yuǎn)程桌面連接程序代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05