zoukankan      html  css  js  c++  java
  • C#_Winfrom将浏览器生成Image

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Drawing.Imaging; 
    using System.Runtime.InteropServices; 
    using System.Security;
    namespace Print
    {
        public class Test
        {
            public static Bitmap GetHtmlImage(Uri UrlString, int Width)
            {
                WebBrowser MyControl = new WebBrowser();
                MyControl.Size = new Size(Width, 10);
                MyControl.Url = UrlString;
                while (MyControl.ReadyState != WebBrowserReadyState.Complete)
                {
                    Application.DoEvents();
                }
                MyControl.Height = MyControl.Document.Body.ScrollRectangle.Height + 20;
                MyControl.Url = UrlString;
                WebControlImage.Snapshot snap = new WebControlImage.Snapshot();
                Bitmap MyImage = snap.TakeSnapshot(MyControl.ActiveXInstance, new Rectangle(0, 0, MyControl.Width, MyControl.Height));
                MyControl.Dispose();
                return MyImage;
            }
            /// 
            /// WebBrowser获取图形 
            /// 
            private class WebControlImage
            {
                internal static class NativeMethods
                {
                    [StructLayout(LayoutKind.Sequential)]
                    public sealed class tagDVTARGETDEVICE
                    {
                        [MarshalAs(UnmanagedType.U4)]
                        public int tdSize;
                        [MarshalAs(UnmanagedType.U2)]
                        public short tdDriverNameOffset;
                        [MarshalAs(UnmanagedType.U2)]
                        public short tdDeviceNameOffset;
                        [MarshalAs(UnmanagedType.U2)]
                        public short tdPortNameOffset;
                        [MarshalAs(UnmanagedType.U2)]
                        public short tdExtDevmodeOffset;
                    }
                    [StructLayout(LayoutKind.Sequential)]
                    public class COMRECT
                    {
                        public int left;
                        public int top;
                        public int right;
                        public int bottom;
                        public COMRECT()
                        {
                        }
                        public COMRECT(Rectangle r)
                        {
                            this.left = r.X;
                            this.top = r.Y;
                            this.right = r.Right;
                            this.bottom = r.Bottom;
                        }
                        public COMRECT(int left, int top, int right, int bottom)
                        {
                            this.left = left;
                            this.top = top;
                            this.right = right;
                            this.bottom = bottom;
                        }
                        public static NativeMethods.COMRECT FromXYWH(int x, int y, int width, int height)
                        {
                            return new NativeMethods.COMRECT(x, y, x + width, y + height);
                        }
                        public override string ToString()
                        {
                            return string.Concat(new object[] { "Left = ", this.left, " Top ", this.top, " Right = ", this.right, " Bottom = ", this.bottom });
                        }
                    }
                    [StructLayout(LayoutKind.Sequential)]
                    public sealed class tagLOGPALETTE
                    {
                        [MarshalAs(UnmanagedType.U2)]
                        public short palVersion;
                        [MarshalAs(UnmanagedType.U2)]
                        public short palNumEntries;
                    }
                }
                public class Snapshot
                {
                    /// 
                    /// ?煺? 
                    /// 
                    /// Com 对象 
                    /// 图象大小 
                    /// 
                    public Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect)
                    {
                        if (pUnknown == null)
                            return null;
                        //必须为com对象 
                        if (!Marshal.IsComObject(pUnknown))
                            return null;
                        //IViewObject 接口 
                        UnsafeNativeMethods.IViewObject ViewObject = null;
                        IntPtr pViewObject = IntPtr.Zero;
                        //内存图 
                        Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height);
                        Graphics hDrawDC = Graphics.FromImage(pPicture);
                        //获取接口 
                        object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown),
                        ref UnsafeNativeMethods.IID_IViewObject, out pViewObject);
                        try
                        {
                            ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(UnsafeNativeMethods.IViewObject)) as UnsafeNativeMethods.IViewObject;
                            //调用Draw方法 
                            ViewObject.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT,
                            -1,
                            IntPtr.Zero,
                            null,
                            IntPtr.Zero,
                            hDrawDC.GetHdc(),
                            new NativeMethods.COMRECT(bmpRect),
                            null,
                            IntPtr.Zero,
                            0);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            throw ex;
                        }
                        //释放 
                        hDrawDC.Dispose();
                        return pPicture;
                    }
                }
                [SuppressUnmanagedCodeSecurity]
                internal static class UnsafeNativeMethods
                {
                    public static Guid IID_IViewObject = new Guid("{0000010d-0000-0000-C000-000000000046}");
                    [ComImport, Guid("0000010d-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
                    public interface IViewObject
                    {
                        [PreserveSig]
                        int Draw([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [In] NativeMethods.COMRECT lprcBounds, [In] NativeMethods.COMRECT lprcWBounds, IntPtr pfnContinue, [In] int dwContinue);
                        [PreserveSig]
                        int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hicTargetDev, [Out] NativeMethods.tagLOGPALETTE 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)] System.Runtime.InteropServices.ComTypes.IAdviseSink pAdvSink);
                        void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] System.Runtime.InteropServices.ComTypes.IAdviseSink[] pAdvSink);
                    }
                }
            }
        }
    }
    将html生成图片的类
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Imaging;
    
    namespace Excel文件处理
    {
        public partial class Html : Form
        {
            public Html()
            {
                InitializeComponent();
            }
            private string ImageUrl = "";//图片地址
            private string ImageName = "";//图片名称
            private void button1_Click(object sender, EventArgs e)
            {
                string HtmlUrl = this.Txt_Url.Text.Trim(); 
                if (HtmlUrl=="")
                {
                    MessageBox.Show("请输入网址");
                    return;
                } 
                if (ImageUrl.Trim()=="")
                { 
                    ImageUrl = @"C:UsersAdministratorDesktop";   
                }
                try
                {
                    Uri ri = new Uri(this.Txt_Url.Text);
                    Bitmap bit = Print.Test.GetHtmlImage(ri, 1200);
                    ImageName = this.Txt_Name.Text.Trim();//图片名称
                    if (ImageName != "")
                    {
                        if (ImageName.IndexOf('.') != -1)
                        {//当用户输入图片后缀时,将后缀截取
                            ImageName.Substring(0, ImageName.LastIndexOf('.'));
                        }
                    }
                    else
                        ImageName = DateTime.Now.Ticks.ToString();//时间名称
                    switch (this.comboBox1.SelectedText)
                    {
                        case "GIF": ImageUrl += "\" + ImageName + ".gif"; break;
                        case "JPG": ImageUrl += "\" + ImageName + ".jpg"; break;
                        case "PNG": ImageUrl += "\" + ImageName + ".png"; break;
                        default: ImageUrl += "\" + ImageName + ".png"; break;
                    }
    
                    switch (this.comboBox1.SelectedText)
                    {
                        case "GIF": bit.Save(ImageUrl, ImageFormat.Gif); break;
                        case "JPG": bit.Save(ImageUrl, ImageFormat.Jpeg); break;
                        case "PNG": bit.Save(ImageUrl, ImageFormat.Png); break;
                        default: bit.Save(ImageUrl, ImageFormat.Png); break;
                    }
    
                    bit = null;
                    ImageUrl = "";//图片地址
                    ImageName = "";//图片名称
                    MessageBox.Show("生产成功");
                }
                catch
                {
                    MessageBox.Show("网址输入有误!");
                    return;
                }
               
            }
    
            private void button2_Click(object sender, EventArgs e)
            { 
                //获取保存路径
                if (this.folderBrowserDialog1.ShowDialog()==DialogResult.OK)
                {
                    if (this.folderBrowserDialog1.SelectedPath.Trim()!="")
                    {
                        ImageUrl = folderBrowserDialog1.SelectedPath;
                        this.label6.Text = ImageUrl;
                    }
                }
                
            }
        }
    }
    winfrom后台处理方面

  • 相关阅读:
    两数之和
    swift 结构体
    打家劫舍II
    Swift的访问控制讲解
    swift版 二分查找 (折半查找)
    RAC(ReactiveCocoa)介绍(一)
    变位词
    双向循环链表
    单链表
    顺序链表(C++)
  • 原文地址:https://www.cnblogs.com/ingstyle/p/4081123.html
Copyright © 2011-2022 走看看