C# 整个网页保存成图片

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.GetIUnknownForObjec t(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.IAdviseSin k 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.IAdviseSin k[] pAdvSink);

}

}

}

}

}

时间: 2024-10-07 23:57:08

C# 整个网页保存成图片的相关文章

批量将网页转换成图片或PDF文档技巧分享

工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,虽然多数浏览器具有滚动截屏或者打印输出PDF文档功能,但是如果有几十上百张网页需要处理,那也是要人命的.所以我一直想找一款能够批量处理该工作的软件,但基本都是收费的,即便是收费的功能也一般.终于,我找到了wkhtmltopdf这款免费开源软件,最贴合我的工作,由衷感谢软件的作者"Jakob Truelsen"和"Ashish Kulkarni"两位大神!我安装软件后,结合windows的批处理命令,顺利测

基于html2canvas实现网页保存为图片及图片清晰度优化

本次技术调研来源于H5项目中的一个重要功能需求:实现微信长按网页保存为截图. 这里有个栗子(请用微信打开,长按图片即可保存):3分钟探索你的知识边界 将整个网页保存为图片是一个十分有趣的功能,常见于H5活动页的结尾页分享.以下则是项目中调研和踩坑的一些小结和汇总. 一.实现HTML页面保存为图片 1.1 已知可行方案 现有已知能够实现网页保存为图片的方案包括: 方案1:将DOM改写为canvas,然后利用canvas的toDataURL方法实现将DOM输出为包含图片展示的data URI 方案2

网页保存为图片及高清截图的优化 | canvas跨域图片配置

本次技术调研来源于H5项目中的一个重要功能需求:实现微信长按网页保存为截图. 这里有个栗子(请用微信打开,长按图片即可保存):3分钟探索你的知识边界 将整个网页保存为图片是一个十分有趣的功能,常见于H5活动页的结尾页分享.以下则是项目中调研和踩坑的一些小结和汇总. 一.实现HTML网页保存为图片 1.1 已知可行方案 现有已知能够实现网页保存为图片的方案包括: 方案1:将DOM改写为canvas,然后利用canvas的toDataURL方法实现将DOM输出为包含图片展示的data URI 方案2

如何把Excel中的单元格等对象保存成图片

对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求, 需要对Excel中的一些对象进行拍图,比如,对一个单元格设置一些颜色之后拍图,或者对一个图表,报表拍成图片.经过比较曲折的经历,终于还是完成了.拿出来分享一下. 要做Excel,首先当然是查看Excel的com对象模型.地址在这里: http://msdn.microsoft.com/en-us

OpenGL中的深度、深度缓存、深度测试及保存成图片

1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联.      首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面).      然后,在场景中以任意次序绘制所有物体.硬件或者软件所执行的图形计算把每一个绘制表面

把网页保存为图片

关于把网页保存为图片,一种就是一张一张截图,但是这种方法太过麻烦,还不方便. 第二种就是用浏览器的自带功能完成,设置-网页另存为,或者使用快捷键ctrl+m 目前360浏览器和qq浏览器是支持这种方式的

OpenGL 绘制效果保存成图片

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net opengl中有一个非常有用的函数:glReadPixels(),可以读取各种缓冲区(深度.颜色,etc)的数值.要将opengl的绘制场景保存成图片,也需要使用这个函数. 一个简单的例子见如下的c程序.按键盘上的“C”键,可以将读取的图像缓冲区数据存储成tmpcolor.txt. #include "windows.h"

利用html2canvas将当前网页保存为图片.

先分析下这个技术可实现的方式,以及优缺点吧! 前端实现 缺点是:兼容性查,需要高级浏览器支持,因为需要支持 canvas 绘图,还有就是会操作 html5 canvas api.(如果不会使用canvas的话,要么去学,要么这条方案当我没说)优点是:用户体验性很赞,很流畅. 大体实现方法:使用canvas.最终可将绘制的图像生成成图片.用户可以另存为保存,也可以将生成的二进制图片,上传服务器,生成连接. 后端实现 缺点是:体验性会差很多,因为需要和服务器交互,体验流畅度会差一点. 优点:客户端兼

Canvas图保存成图片或pdf

Canvas画好的图片虽然可以通过toDataURL()转成二进制流的字符串格式,图片稍大一点就无法发送了,当然如果需求简单的话,可以在页面上加一个image元素,将转成的流直接赋给image的src就可以显示图片了. 但是大部分的时候我们还希望弹出保存框,保存图片到我们自己想要的路径下,或者添加一些统计和分析的信息到pdf中一起保存成一个pdf文件,这就需要在后台处理了,两种方式:后台新建一个Web Browser加载当前的页面,然后将获得到的图片流的信息再发送到前台弹出保存的对话框,后台发送