一般来说,我们如果想生成一张图片,就会调用GDI方法,画直线、画文字、画矩形等,整体制作下来很繁琐。
//创建Graphics对象 Graphics GPS = this.CreateGraphics(); //创建黑色pen对象 Pen MyPen = new Pen(Color.Black, 2f); //确定起点和终点 Point pt1 = new Point(70, 20); Point pt2 = new Point(200, 320); //使用DrawLine方法绘制直线 GPS.DrawLine(MyPen, pt1, pt2);
如果想制作这样一张图片,肯定要费不小功夫。可以剑走偏锋,用另一种方法实现。就是先生成html网页文件,制作完后再生成图片文件。这里只提供一种生成图片的方法,并不能实现所有图片。
制作html网页文件,应该都不难。会简单的html代码即可。下面是我们制作好的html文件,代码很简单,主要包括h2、h3、img和table
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> </head> <body> <center> <table border="0" width="800" cellspacing="10"> <tr> <td rowspan="3"><img style="width:150px;height:150px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/tempfile2/matchCover.jpg" /></td> <td>2022澳大利亚羽毛球公开赛</td> <td rowspan="3"><img style="width:150px;height:100px;" src="D:\NaviSoft\Docs3100\02.需求分析\产品-羽毛球档案-需求\alex.jpg" /></td> </tr> <tr> <td>11月15日-11月20日 悉尼 super300</td> </tr> <tr> <td>11月18日 1/4决赛 赛程</td> </tr> </table><br /> <h3>场地 <span style="color:red;">1</span> 北京时间<span style="color:red;">12:00</span>开始</h3> <table border="0" width="700" cellspacing="10"> <tr style="background-color:darkgray"><td>项目</td><td colspan="2">对阵</td><td>排名</td><td>纪录</td></tr> <!--第1组--> <tr style="background-color:antiquewhite"><td rowspan="2">混双</td><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/china.png" /></td><td>金元昊/郑娜恩</td><td>45</td><td>0</td></tr> <tr style="background-color:antiquewhite"><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/chinesetaipei.png" /></td><td>张课琦/李芷秦</td><td>79</td><td>0</td></tr> <!--第2组--> <tr style="background-color:coral"><td rowspan="2">混双</td><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/china.png" /></td><td>冯彦哲/黄东萍</td><td>2</td><td>1</td></tr> <tr style="background-color: coral"><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/indonesia.png" /></td><td>毛拉纳/马瓦哈</td><td>34</td><td>0</td></tr> <!--第3组--> <tr style="background-color: antiquewhite"><td rowspan="2">女单</td><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/korea.png" /></td><td>安洗莹</td><td>2</td><td>1</td></tr> <tr style="background-color: antiquewhite"><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/chinesetaipei.png" /></td><td>白驭珀</td><td>34</td><td>0</td></tr> <!--第4组--> <tr style="background-color:coral"><td rowspan="2">男双</td><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/china.png" /></td><td>何济霆/周昊东</td><td>28</td><td>0</td></tr> <tr style="background-color: coral"><td><img style="width:40px;height:30px;" src="https://navisoft.oss-cn-hangzhou.aliyuncs.com/badminton2/country/china.png" /></td><td>梁伟铿/王昶</td><td>23</td><td>0</td></tr> </table><br /> </center> </body> </html>
效果如下图所示,需要美化只要加些样式文件即可
接下来才是重点,如果把这个html文件转成图片文件,思路还是把html文件加载至WebBrowser控件(也可以加载至微软最新的浏览器控件WebView2),然后在控件的DocumentComplete事件中,调用DrawToBitmap方法即可
/// <summary> /// 网页地址转为图片服务类 /// </summary> class WebPageToImageService { //调用示例 //string urlPath = "http://www.cnblogs.com/xiyang1011/"; //string filePath = @"C:\Test.jpeg"; //WebPageToImageUtil imageUtil = new WebPageToImageUtil(urlPath, filePath); //Bitmap imageWebPage = imageUtil.Generate(); private Bitmap m_Bitmap; private string m_Url; private string m_FileName = string.Empty; public WebPageToImageService(string url) { // Without file m_Url = url; } public WebPageToImageService(string url, string fileName) { // With file m_Url = url; m_FileName = fileName; } private void _Generate() { var browser = new WebBrowser { ScrollBarsEnabled = false }; browser.Navigate(m_Url); browser.DocumentCompleted += WebBrowser_DocumentCompleted; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // Capture var browser = (WebBrowser)sender; browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.BringToFront(); browser.DrawToBitmap(m_Bitmap, browser.Bounds); // Save as file? if (m_FileName.Length > 0) { // Save m_Bitmap.SaveJPG100(m_FileName); } } public Bitmap Generate() { // Thread var m_thread = new Thread(_Generate); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } }
代码二次封装
public static Image SnippingWebPage(string url, string fileName = null) { WebPageToImageService imService = new WebPageToImageService(url, fileName); Bitmap bitmap = imService.Generate(); return bitmap; }
经过测试,html中包含图片也能一并生成到图片里,图片可以是网络地址,还可以是本地文件。怎么样?这个方法是不是比Gdi要简单很多吧
string htmlFile = @"D:\NaviOther\aliyunoss\badminton2\player2\59673-2022.html"; string imgFile = @"D:\NaviOther\aliyunoss\badminton2\player2\59673-2022.jpg"; ImageUtil.SnippingWebPage(htmlFile, imgFile);
相关阅读
文章评论