读书人

抓取网页图片有关问题

发布时间: 2012-03-19 22:03:05 作者: rapoo

抓取网页图片问题
请问怎么用C#程序实现抓取网页上的图片?
然后把该图片保存为相应格式(jpg、gif…)?
可以的话麻烦给出代码~多谢啦!!!

[解决办法]
http://blog.csdn.net/hertcloud/archive/2007/03/14/1528971.aspx

通过HttpWebResponse和HttpWebRequest 获取http地址上的图片
[解决办法]

主要思想:
使用IE控件先显示网页,然后使用API函数将其绘画内容写入image对象,然后保存。
主要函数,传入IE控件
public static Image Capture(Control control, ImageSettingInfo imageInfo)

codeproject有个示例,可以拍摄一个很大的网页的图片,我这个只能拍摄当前显示的内容,但可以拍摄任何控件。

以下是代码:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
using System.Drawing.Imaging;

using BaseFrame.ShareFunction;

namespace BaseFrame.Images
{
/// <summary>
/// 捕获窗口的影响
/// </summary>
public sealed class CaptureImage
{
// Violates rule: StaticHolderTypesShouldNotHaveConstructors.
// Uncomment the following line to correct the violation.
private CaptureImage() { }

[DllImport( "user32.dll ")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern Boolean PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);

#region 常量
/// <summary>
/// 画图开始X坐标
/// </summary>
public const int BRWTOP = 0;
/// <summary>
/// Y坐标
/// </summary>
public const int BRWLEFT = 0;
/// <summary>
/// 图片质量
/// </summary>
public const long QUALITY = 100;
/// <summary>
/// 原图大小
/// </summary>
public const double RESOLUTION = 1.0;
#endregion

//public delegate void CaptureHandler();

//public static event CaptureHandler CaptureImageEvent;

//public delegate void ThumbnailHandler();

//public static event ThumbnailHandler ThumbnailImageEvent;

public static Image Capture(Control control, ImageSettingInfo imageInfo)
{
Debug.Assert(control != null);
if (control == null)
{
throw new ArgumentNullException( "control is null ");
}
Debug.Assert(imageInfo != null);
if (imageInfo == null)
{
throw new ArgumentNullException( "imageInfo is null ");
}

IntPtr hwnd = control.Handle;
//Get bitmap to hold screen fragment.
Bitmap bm = null;

Graphics g = null;
IntPtr hdc;
//Image screenfrag = null;

Bitmap finalImage = null;

Image originalImage = null;
try
{
// 计算最终图片大小
int finalWidth = (int)((imageInfo.ImageWidth) * RESOLUTION);
int finalHeight = (int)((imageInfo.ImageHeight) * RESOLUTION);

bm = new Bitmap(finalWidth, finalHeight, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

g = Graphics.FromImage(bm);

hdc = g.GetHdc();

// 绘画目标窗口到 hdc


PrintWindow(hwnd, hdc, 0);

g.ReleaseHdc(hdc);

g.Flush();

g.DrawImage(bm, BRWLEFT, BRWTOP, finalWidth, finalHeight);

//Write Image.
EncoderParameters eps = new EncoderParameters(1);

eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, QUALITY);

ImageCodecInfo ici = GetEncoderInfo( "image/ " + imageInfo.ImageFormat.ToString().ToLower());

// 确保保存路径存在
if (!Directory.Exists(Path.GetDirectoryName(imageInfo.ImageSavePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(imageInfo.ImageSavePath));
}

// 保存图片
bm.Save(imageInfo.ImageSavePath, ici, eps);

// 返回最终图片
originalImage = Image.FromHbitmap(bm.GetHbitmap());
}
catch (ExternalException ex)
{
LogInfo.Log(ex);
}
catch (IOException ex)
{
LogInfo.Log(ex);
}
catch (Exception ex)
{
LogInfo.Log(ex);
}
finally
{
if (g != null)
g.Dispose();
if (bm != null)
bm.Dispose();
if (finalImage != null)
finalImage.Dispose();
}

return originalImage;
}

private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
}
}

读书人网 >C#

热点推荐