1. 程式人生 > >利用Selenium+PhantomJS 實現截圖

利用Selenium+PhantomJS 實現截圖

rgs 重載 public 服務器 console read using default tom

using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading.Tasks;

namespace WebKitTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Parallel.For(
0, 20, i => { var url = "http://www.baidu.com"; IWebDriver driver = new PhantomJSDriver(GetPhantomJSDriverService()); driver.Navigate().GoToUrl(url); ITakesScreenshot screenshotDriver = driver as ITakesScreenshot; Screenshot screenshot
= screenshotDriver.GetScreenshot(); using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray)) { using (var soourceImage = Image.FromStream(stream)) { var cutedImage = GetReducedImage(800, 800
, soourceImage); if (cutedImage != null) { cutedImage.Save(AppDomain.CurrentDomain.BaseDirectory + "//" + i.ToString() + ".jpg", ImageFormat.Jpeg); } } } }); for (int i = 0; i < 100; i++) { } Console.Read(); } private static PhantomJSDriverService GetPhantomJSDriverService() { PhantomJSDriverService pds = PhantomJSDriverService.CreateDefaultService(); //設置代理服務器地址 //pds.Proxy = $"{ip}:{port}"; //設置代理服務器認證信息 //pds.ProxyAuthentication = GetProxyAuthorization(); return pds; } /// <summary> /// 生成縮略圖重載方法1,返回縮略圖的Image對象 /// </summary> /// <param name="targetWidth">縮略圖的寬度</param> /// <param name="targetHeight">縮略圖的高度</param> /// <returns>縮略圖的Image對象</returns> public static Image GetReducedImage(int targetWidth, int targetHeight, Image sourceImage) { try { //用指定的大小和格式初始化Bitmap類的新實例 Bitmap bitmap = new Bitmap(targetWidth, targetHeight, PixelFormat.Format32bppArgb); //從指定的Image對象創建新Graphics對象 using (Graphics graphics = Graphics.FromImage(bitmap)) { //清除整個繪圖面並以透明背景色填充 graphics.Clear(Color.Transparent); //在指定位置並且按指定大小繪制原圖片對象 int sourceWidth = sourceImage.Width; int sourceHeight = sourceImage.Height; int sourceStartX = 0; int targetStartX = 0; int sourceStartY = 0; int targetStartY = 0; int sourceEndX = 0; int targetEndX = 0; int sourceEndY = 0; int targetEndY = 0; if (sourceWidth <= targetWidth) { sourceStartX = 0; targetStartX = (targetWidth - sourceWidth) / 2; sourceEndX = sourceWidth; targetEndX = sourceWidth + targetStartX; } else { sourceStartX = (sourceWidth - targetWidth) / 2; targetStartX = 0; sourceEndX = targetWidth + sourceStartX; targetEndX = targetWidth; } if (targetEndX - sourceStartX > targetWidth) { targetEndX = targetWidth - sourceStartX; } if (sourceHeight <= targetHeight) { sourceEndY = sourceHeight; targetEndY = sourceHeight; } else { sourceEndY = targetHeight; targetEndY = targetHeight; } Rectangle destRect = new Rectangle(targetStartX, targetStartY, targetEndX - targetStartX, targetEndY - targetStartY);//矩形容器 Rectangle srcRect = new Rectangle(sourceStartX, sourceStartY, sourceEndX - sourceStartX, sourceEndY - sourceStartY); graphics.DrawImage(sourceImage, destRect, srcRect, GraphicsUnit.Pixel); return bitmap; } } catch (Exception e) { return null; } } } }

private static void Main(string[] args) { Parallel.For(0, 20, i => { var url = "http://www.baidu.com"; IWebDriver driver = new PhantomJSDriver(GetPhantomJSDriverService()); driver.Navigate().GoToUrl(url); ITakesScreenshot screenshotDriver = driver as ITakesScreenshot; Screenshot screenshot = screenshotDriver.GetScreenshot(); using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray)) { using (var soourceImage = Image.FromStream(stream)) { var cutedImage = GetReducedImage(800, 800, soourceImage); if (cutedImage != null) { cutedImage.Save(AppDomain.CurrentDomain.BaseDirectory + "//" + i.ToString() + ".jpg", ImageFormat.Jpeg); } } } }); for (int i = 0; i < 100; i++) { } Console.Read(); }
private static PhantomJSDriverService GetPhantomJSDriverService() { PhantomJSDriverService pds = PhantomJSDriverService.CreateDefaultService(); //設置代理服務器地址 //pds.Proxy = $"{ip}:{port}"; //設置代理服務器認證信息 //pds.ProxyAuthentication = GetProxyAuthorization(); return pds; }
/// <summary> /// 生成縮略圖重載方法1,返回縮略圖的Image對象 /// </summary> /// <param name="targetWidth">縮略圖的寬度</param> /// <param name="targetHeight">縮略圖的高度</param> /// <returns>縮略圖的Image對象</returns> public static Image GetReducedImage(int targetWidth, int targetHeight, Image sourceImage) { try { //用指定的大小和格式初始化Bitmap類的新實例 Bitmap bitmap = new Bitmap(targetWidth, targetHeight, PixelFormat.Format32bppArgb); //從指定的Image對象創建新Graphics對象 using (Graphics graphics = Graphics.FromImage(bitmap)) { //清除整個繪圖面並以透明背景色填充 graphics.Clear(Color.Transparent); //在指定位置並且按指定大小繪制原圖片對象
int sourceWidth = sourceImage.Width; int sourceHeight = sourceImage.Height; int sourceStartX = 0; int targetStartX = 0; int sourceStartY = 0; int targetStartY = 0; int sourceEndX = 0; int targetEndX = 0; int sourceEndY = 0; int targetEndY = 0; if (sourceWidth <= targetWidth) { sourceStartX = 0; targetStartX = (targetWidth - sourceWidth) / 2; sourceEndX = sourceWidth; targetEndX = sourceWidth + targetStartX; } else { sourceStartX = (sourceWidth - targetWidth) / 2; targetStartX = 0; sourceEndX = targetWidth + sourceStartX; targetEndX = targetWidth; } if (targetEndX - sourceStartX > targetWidth) { targetEndX = targetWidth - sourceStartX; }
if (sourceHeight <= targetHeight) { sourceEndY = sourceHeight; targetEndY = sourceHeight; } else { sourceEndY = targetHeight; targetEndY = targetHeight; } Rectangle destRect = new Rectangle(targetStartX, targetStartY, targetEndX - targetStartX, targetEndY - targetStartY);//矩形容器 Rectangle srcRect = new Rectangle(sourceStartX, sourceStartY, sourceEndX - sourceStartX, sourceEndY - sourceStartY);
graphics.DrawImage(sourceImage, destRect, srcRect, GraphicsUnit.Pixel); return bitmap; } } catch (Exception e) { return null; } }

利用Selenium+PhantomJS 實現截圖