/// <summary>
/// 图片类型枚举
/// </summary>
public enum ImageType
{
GIF = ,
JPG = ,
PNG =
} /// <summary>
/// 图片辅助类
/// </summary>
public class ImageHelper
{
/// <summary>
/// 将Url地址保存为图片
/// </summary>
/// <param name="url">网页路径</param>
/// <param name="savePath">图片存放路径</param>
/// <param name="imageType">图片类型</param>
/// <returns></returns>
public static string SaveUrlToImage(string url, string savePath, ImageType imageType)
{
var uri = new Uri(url);
using (var bit = GetHtmlImage(uri, Screen.PrimaryScreen.Bounds.Width))
{
switch (imageType)
{
case ImageType.GIF:
bit.Save(savePath, ImageFormat.Gif);
break;
case ImageType.JPG:
bit.Save(savePath, ImageFormat.Jpeg);
break;
case ImageType.PNG:
bit.Save(savePath, ImageFormat.Png);
break;
default:
bit.Save(savePath, ImageFormat.Jpeg);
break;
}
return savePath;
}
} protected static Bitmap GetHtmlImage(Uri urlString, int width)
{
using (var control = new WebBrowser { Size = new Size(width, ), Url = urlString, ScriptErrorsSuppressed = true })
{
while (control.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
if (control.Document != null)
{
if (control.Document.Body != null)
{
control.Height = control.Document.Body.ScrollRectangle.Height + ;
}
}
control.Url = urlString;
var snap = new WebControlImage.Snapshot();
var bitmap = snap.TakeSnapshot(control.ActiveXInstance, new Rectangle(, , control.Width, control.Height));
control.Dispose();
return bitmap;
}
} /// WebBrowser获取图形
protected 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)
{
left = r.X;
top = r.Y;
right = r.Right;
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 Comrect FromXywh(int x, int y, int width, int height)
{
return new Comrect(x, y, x + width, y + height);
} public override string ToString()
{
return string.Concat("Left = ", left, " Top ", top, " Right = ", right, " Bottom = ", bottom);
}
} [StructLayout(LayoutKind.Sequential)]
public sealed class TagLogpalette
{
[MarshalAs(UnmanagedType.U2)]
public short palVersion;
[MarshalAs(UnmanagedType.U2)]
public short palNumEntries;
}
} public class Snapshot
{
/// 图象大小
public Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect)
{
if (pUnknown == null) { return null; }
//必须为com对象
if (!Marshal.IsComObject(pUnknown)) { return null; }
//IViewObject 接口
IntPtr viewObject;
//内存图
var bitmap = new Bitmap(bmpRect.Width, bmpRect.Height);
var image = Graphics.FromImage(bitmap);
//获取接口
object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown), ref UnsafeNativeMethods.IidIViewObject, out viewObject);
try
{
var o = (UnsafeNativeMethods.IViewObject)Marshal.GetTypedObjectForIUnknown(viewObject, typeof(UnsafeNativeMethods.IViewObject));
//调用Draw方法
if (o != null)
{
o.Draw((int)DVASPECT.DVASPECT_CONTENT, -, IntPtr.Zero, null, IntPtr.Zero, image.GetHdc(), new NativeMethods.Comrect(bmpRect), null, IntPtr.Zero, );
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
//释放
image.Dispose();
return bitmap;
}
} [SuppressUnmanagedCodeSecurity]
internal static class UnsafeNativeMethods
{
public static Guid IidIViewObject = 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)] 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);
}
}
}
}

网页快照 - C#实现的更多相关文章

  1. 转 nutch网页快照乱码解决方法

    修改apache-tomcat-7.0.55\webapps\nutch-1.2下的cached.jsp 将content = new String(bean.getContent(details)) ...

  2. linux命令行抓取网页快照-(xvfb+CutyCapt)

    目的: 在一台没有安装X-server的Debian服务器上实现命令行抓取网页快照 软件: xvfb(在命令行下实现对X-server的模拟,渲染图形进行缓存)-在没有安装X-Server的环境下提供 ...

  3. php 利用第三方软件进行网页快照

    网页快照有很多方法,具体的大家可以百度下.这里我复制一位别人的. 这里我只说下利用第三方软件(Web2Pic_Pro)实现. (1). 下载web2pic_pro软件.下载地址 http://isha ...

  4. linux命令行抓取网页快照

    linux命令行抓取网页快照-(xvfb+CutyCapt)   目的: 在一台没有安装X-server的Debian服务器上实现命令行抓取网页快照 软件: xvfb(在命令行下实现对X-server ...

  5. [转]Phantomjs实现获取网页快照并生成缩略图

    Shell脚本实现获取网页快照并生成缩略图 这篇文章主要介绍了Shell脚本实现获取网页快照并生成缩略图,本文获取网页快照使用phantomjs.生成缩略图使用ImageMagick,需要的朋友可以参 ...

  6. IECapt、CutyCapt 生成网页快照

    IECapt.CutyCapt  生成网页快照 http://iecapt.sourceforge.net/ http://cutycapt.sourceforge.net/ 1.以管理员身份 运行c ...

  7. C#实现HTML转图片(网页快照)

    有时候我们需要将网页转成图片,那么可以使用WebBrowser来生成网页快照,废话不多说,代码如下 1.网页快照帮助类(如果是BS或控制台需要引用System.Windows.Forms类库): pu ...

  8. shell脚本获取网页快照并生成缩略图

    获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考官方网站. 1.安装 我的环境 ...

  9. 【C#】NET截屏网页,生成网页快照开发——IECapt、CutyCapt

    软件介绍 IECapt.CutyCapt 生成网页快照 http://iecapt.sourceforge.net/ http://cutycapt.sourceforge.net/ ### 操作代码 ...

  10. ASP.NET 之 网页快照 (DrawToBitmap)

    一.添加引用 在解决方案上单击右键,选择“Add Reference...”,添加“System.Windows.Forms”,添加完后,Web.Config 中应该有类似下面的内容: <sys ...

随机推荐

  1. 滚动轮播插件——jCarouselLite

    jcarousellite(上下.水平滚动元素插件)插件使用: 参数说明: btnPrev     string 上一个按钮的class名, 比如  btnPrev: ".prev" ...

  2. HDOJ --- Super Jumping! Jumping! Jumping!

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. Oracle函数题

    Examine this function: CREATE OR REPLACE FUNCTION CALC_PLAYER_AVG (V_ID in PLAYER_BAT_STAT.PLAYER_ID ...

  4. Page Object 模式编写UiAutomator脚本

    在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...

  5. Yii框架常见问题汇总

    然用过Yii做了一个小项目了,但是过程中间解决的问题没有随手记下来,导致新项目开始后,以前碰到的问题还得在查一遍,干脆就记下来,以便不时之需. 有新的会随时更新. 1.如何显示ActiveRecord ...

  6. weblogic开发模式与生产模式介绍

    weblogic开发模式与生产模式介绍 开发模式:该模式启用自动部署 生产模式:该模式关闭自动部署 weblogic server 三种部署方法:自动部署.控制台部署.命令部署 自动部署:当其处于启用 ...

  7. JavaScript效果之选项卡

    拼了命学习js,想把学到的Javascript效果,可以记在博客里,在记录过程中,加深理解. gogogo,第一个效果,选项卡. 一.选项卡效果的实现思路 选项卡效果的应用很广泛,几乎所有的网站都会用 ...

  8. VM下的linux系统上不了网?? 使用putty远程登录不上linux的解决方法?

    背景:昨晚想尝试一下用putty远程登录我的linux系统,悲剧的是,我竟然连接不上,显示 connection refused   ,连接被拒绝.于是我就想看看能不能在linux下看看能不能访问百度 ...

  9. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  10. hadoop错误java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try

    错误: java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more go ...