zoukankan      html  css  js  c++  java
  • C#将HTML代码转换为图片

    前端通过富文本控件接收到了一段html代码,后端想通过图片的形式展示到另外的地方,这种情况怎么处理呢。直接上代码:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Runtime.InteropServices.ComTypes;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace ConsoleApplication1
    {
        /// <summary>
        /// 类说明:HTML代码转换为图片的公共类
        /// 作者:段江涛
        /// 时间:2019/10/17 11:16:38
        /// </summary>
        public class HtmlToPicHelper
        {
            private static Bitmap ConverHTML(string htmPath)
            {
                string ImagePath = string.Empty;
                WebBrowser web = new WebBrowser();
                web.Navigate(htmPath);
                while (web.ReadyState != WebBrowserReadyState.Complete)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
                Rectangle screen = Screen.PrimaryScreen.Bounds;
                Size? imgsize = null;
                //set the webbrowser width and hight
                web.Width = screen.Width;
                web.Height = screen.Height;
                //suppress script errors and hide scroll bars
                web.ScriptErrorsSuppressed = true;
                web.ScrollBarsEnabled = false;
                Rectangle body = web.Document.Body.ScrollRectangle;
    
                //check if the document width/height is greater than screen width/height
                Rectangle docRectangle = new Rectangle()
                {
                    Location = new Point(0, 0),
                    Size = new Size(body.Width > screen.Width ? body.Width : screen.Width,
                     body.Height > screen.Height ? body.Height : screen.Height)
                };
                //set the width and height of the WebBrowser object
                web.Width = docRectangle.Width;
                web.Height = docRectangle.Height;
    
                //if the imgsize is null, the size of the image will
                //be the same as the size of webbrowser object
                //otherwise  set the image size to imgsize
                Rectangle imgRectangle;
                if (imgsize == null)
                    imgRectangle = docRectangle;
                else
                    imgRectangle = new Rectangle()
                    {
                        Location = new Point(0, 0),
                        Size = imgsize.Value
                    };
                //create a bitmap object
                Bitmap bitmap = new Bitmap(imgRectangle.Width - 24, imgRectangle.Height);
                //get the viewobject of the WebBrowser
                IViewObject ivo = web.Document.DomDocument as IViewObject;
    
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    //get the handle to the device context and draw
                    IntPtr hdc = g.GetHdc();
                    ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero,
                             IntPtr.Zero, hdc, ref imgRectangle,
                             ref docRectangle, IntPtr.Zero, 0);
                    g.ReleaseHdc(hdc);
                }
                return bitmap;
            }
    
            public static byte[] ConverPic(string htmlPath)
            {
                //必须放到独立的线程里面来处理
                Bitmap m_Bitmap = null;
                Thread m_thread = new Thread(new ThreadStart(() =>
                {
                    m_Bitmap = ConverHTML(htmlPath);
                }));
                m_thread.SetApartmentState(ApartmentState.STA);
                m_thread.Start();
                m_thread.Join();
    
                if (m_Bitmap != null)
                {
                    System.IO.MemoryStream ms=new System.IO.MemoryStream();
                    m_Bitmap.Save(ms, ImageFormat.Jpeg);
                    byte[] bs = ms.GetBuffer();
                    ms.Close();
                    return bs;
                }
                return new byte[0];
            }
        }
    
    
        [ComVisible(true), ComImport()]
        [GuidAttribute("0000010d-0000-0000-C000-000000000046")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IViewObject
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int Draw(
                [MarshalAs(UnmanagedType.U4)] UInt32 dwDrawAspect,
                int lindex,
                IntPtr pvAspect,
                [In] IntPtr ptd,
                IntPtr hdcTargetDev,
                IntPtr hdcDraw,
                [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcBounds,
                [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcWBounds,
                IntPtr pfnContinue,
                [MarshalAs(UnmanagedType.U4)] UInt32 dwContinue);
            [PreserveSig]
            int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect,
               int lindex, IntPtr pvAspect, [In] IntPtr ptd,
                IntPtr hicTargetDev, [Out] IntPtr ppColorSet);
            [PreserveSig]
            int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect,
                            int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze);
            [PreserveSig]
            int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze);
            void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects,
              [In, MarshalAs(UnmanagedType.U4)] int advf,
              [In, MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink);
            void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects,
              [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf,
              [In, Out, MarshalAs(UnmanagedType.LPArray)] IAdviseSink[] pAdvSink);
        }
    
    }

     这里面要注意几点:

    1.首先需要引用程序集System.Drawing用于操作图片

    2.需要引用程序集System.Windows.Forms,因为我们使用了控件 WebBrowser

    3.大概使用思路就是将html保存到本地的一个文件中,然后把文件地址传递给ConverPic方法,完成之后再把创建的临时文件删除。

  • 相关阅读:
    ObjectiveC的Runtime System (转载)
    comScore是如何工作的
    ObjectiveC Runtime的数据类型
    Xcode基础
    Android开发ABC之:Context
    ObjectiveC 拾遗
    ObjectiveC 的Compiler Directives
    ObjectiveC 与 C++ 的异同
    Android开发ABC之:Service
    进入Mac OSX的第一步
  • 原文地址:https://www.cnblogs.com/duanjt/p/11693540.html
Copyright © 2011-2022 走看看