WebBrowser コントロールがあり、表示されたページ全体を画像 (任意の Web ページ) に保存したいと考えています。IHTMLElementRender インターフェイスを使用してみましたが、すべての Web ページで機能しませんでした。スナップショットにスクローラーが含まれている場合もあれば、部分的なものだった場合もあるため、何か間違っている可能性があります。Web ページ全体を画像に保存できる実例はありますか?
ありがとう。
WebBrowser コントロールがあり、表示されたページ全体を画像 (任意の Web ページ) に保存したいと考えています。IHTMLElementRender インターフェイスを使用してみましたが、すべての Web ページで機能しませんでした。スナップショットにスクローラーが含まれている場合もあれば、部分的なものだった場合もあるため、何か間違っている可能性があります。Web ページ全体を画像に保存できる実例はありますか?
ありがとう。
IE エンジンを使用してこのタスクを達成する方法を示す優れた CodeProject 記事があります。別のブラウザーのレンダリング エンジンを使用したい場合は、ここから学習を開始することをお勧めします。これを行うFirefox用のアドオンもあります。その内部を掘り下げて、Firefoxでこれを達成する方法についての洞察を得ることができます。
Web ページが JS に重きを置いている場合、たとえば地図アプリなど、提示されたソリューションはうまく機能しません。
Webbrowser コントロールで使用されるこのコードは、より効率的であることがわかりました...
private void waitTillLoad(WebBrowser webBrowser1)
{
WebBrowserReadyState loadStatus;
//wait till beginning of loading next page
int waittime = 100000;
int counter = 0;
while (true)
{
loadStatus = webBrowser1.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
//wait till the page get loaded.
counter = 0;
while (true)
{
loadStatus = webBrowser1.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete)
{
break;
}
counter++;
}
}
http://qualitypoint.blogspot.com/2009/03/c-webbrowser-control-synchronization.htmlの QualityPoint Technologies のクレジット
チッ!
よろしく、 byte_slave
これらの人http://webthumb.bluga.net/homeと次のコードを使用できます。1 か月に数枚の画像のみを生成する必要がある場合は無料ですが、それ以上の場合は少し料金がかかります。
(私は決して彼らと提携していません。私は過去にこれを使用しただけです)
public enum OutputType
{
Png,
Jpg
}
public interface IWebThumbAPI
{
int Delay { get; set; }
int Width { get; set; }
int Height { get; set; }
OutputType OutputType { get; set; }
WebThumbAPI Get(string url);
WebThumbAPI Get(string url, int x, int y, int width, int height);
System.Drawing.Image SaveSize(WebThumbSize webThumbSize);
}
public class WebThumbAPI : IWebThumbAPI
{
private readonly string apiKey;
private IList<WebThumbResponse> webThumbResponse;
private string jobId;
private string ApiUrl { get; set; }
public int Delay { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public OutputType OutputType { get; set; }
public WebThumbAPI(string apiKey)
: this(apiKey, "")
{
}
public WebThumbAPI(string apiKey, string jobId)
{
this.apiKey = apiKey;
OutputType = OutputType.Png;
Width = 1024;
Height = 768;
Delay = 5;
ApiUrl = "http://webthumb.bluga.net/api.php";
this.jobId = jobId;
}
public WebThumbAPI Get(string url)
{
return Get(url, 0, 0, 400, 200);
}
public WebThumbAPI Get(string url, int x, int y, int width, int height)
{
var outputType = OutputType == OutputType.Jpg ? "jpg" : "png";
var doc = new XDocument(
new XElement("webthumb",
new XElement("apikey", apiKey),
new XElement("request",
new XElement("url", url),
new XElement("outputType", outputType),
new XElement("width", Width),
new XElement("height", Height),
new XElement("delay", Delay),
new XElement("excerpt",
new XElement("x", x),
new XElement("y", y),
new XElement("width", width),
new XElement("height", height)))
)
);
var request = getRequest(doc.ToString());
var webResponse = (HttpWebResponse)request.GetResponse();
if (webResponse.ContentType == "text/xml")
{
var stream = webResponse.GetResponseStream();
var response = XDocument.Load(XmlReader.Create(stream));
webThumbResponse = (from xml in response.Descendants("job")
select new WebThumbResponse
{
Estimate = (int)xml.Attribute("estimate"),
Time = (DateTime)xml.Attribute("time"),
Url = (string)xml.Attribute("url"),
Cost = (int)xml.Attribute("cost"),
Job = (string)xml.Value
}).ToList();
stream.Close();
if (webThumbResponse.Count == 0)
jobId = "-1";
else
{
jobId = webThumbResponse[0].Job;
Thread.Sleep(webThumbResponse[0].Estimate * 1000);
}
}
else
{
throw new InvalidOperationException("Failed request");
}
return this;
}
public System.Drawing.Image SaveSize(WebThumbSize webThumbSize)
{
if (jobId == "-1")
return defaultImage(webThumbSize);
var doc = new XDocument(
new XElement("webthumb",
new XElement("apikey", apiKey),
new XElement("fetch",
new XElement("job", jobId),
new XElement("size", Enum.GetName(typeof(WebThumbSize), webThumbSize).ToLower())
)
)
);
var request = getRequest(doc.ToString());
var webResponse = (HttpWebResponse)request.GetResponse();
var stream = webResponse.GetResponseStream();
Image image = null;
try
{
image = System.Drawing.Image.FromStream(stream);
}
catch
{
image = defaultImage(webThumbSize);
}
return image;
}
private Image defaultImage(WebThumbSize webThumbSize)
{
var s = getSize(webThumbSize);
var b = new Bitmap(s.Width, s.Height);
var im = Image.FromHbitmap(b.GetHbitmap());
var gr = System.Drawing.Graphics.FromImage(im);
gr.Clear(Color.White);
gr.Dispose();
return im;
}
private static System.Drawing.Size getSize(WebThumbSize size)
{
switch (size)
{
case WebThumbSize.Small:
return new Size(80, 60);
case WebThumbSize.Excerpt:
return new Size(400, 200);
default:
return new Size(1, 1);
}
}
private HttpWebRequest getRequest(string xml)
{
var request = (HttpWebRequest)WebRequest.Create(ApiUrl);
request.Method = "POST";
request.Timeout = 20000;
request.ContentType = "text/xml";
request.UserAgent = @"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3";
request.KeepAlive = false;
request.Pipelined = false;
Stream newStream = request.GetRequestStream();
var encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(xml);
newStream.Write(data, 0, data.Length);
newStream.Close();
return request;
}
}
public class WebThumbResponse
{
public DateTime Time;
public string Job;
public string Url;
public int Cost;
public int Estimate { get; set; }
}
public enum WebThumbSize
{
Small,
Medium,
Medium2,
Large,
Excerpt
}