0

我正在尝试从 Windows Azure 上的 html 页面生成屏幕截图。这是我在个人 IIS 上使用的代码,我知道它适用于每台测试机器。

using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

class Program
{
    static void Main(string[] args)
    {
        new WebsiteToImage("http://www.google.com", "C:\\screenshot.jpg");
    }

    // Define other methods and classes here
    public class WebsiteToImage
    {
        internal string _url;
        internal string _fileName;

        public WebsiteToImage(string url, string fileName)
        {
            _url = url;
            _fileName = fileName;

            // Thread 
            var thread = new Thread(Generate);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
        }

        private void Generate()
        {
            using (var browser = new WebBrowser { ScrollBarsEnabled = false })
            {
                browser.Navigate(_url);
                browser.DocumentCompleted += WebBrowser_DocumentCompleted;

                while (browser.ReadyState != WebBrowserReadyState.Complete)
                {
                    Application.DoEvents();
                }

                browser.Dispose();
            }
        }

        private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Capture 
            using (var bmp = new Bitmap(1280, 800))
            {
                var browser = (WebBrowser)sender;
                browser.ClientSize = new Size(1280, 800);
                browser.ScrollBarsEnabled = false;
                browser.BringToFront();
                browser.DrawToBitmap(bmp, browser.Bounds);

                var encoderParameters = new EncoderParameters(1);
                encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
                bmp.Save(_fileName, ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID.Equals(ImageFormat.Jpeg.Guid)), encoderParameters);
            }
        }
    }
}

现在,在 Azure 上,我知道我不能使用 GDI+,而且我很确定我也不能使用 WebBrowser。任何想法或替代解决方案?甚至是第三方组件。

4

3 回答 3

1

您还没有说您使用的是 Azure 网站还是 Azure 云服务,但根据您所说的无法使用 GDI+,我猜是网站?

您当然应该能够在云服务中运行您的代码,无论是 Web 还是 Worker 角色。如果代码是托管在网站上的 Web 应用程序的一部分,则可以使用 Azure 存储队列添加要快照的 URL,然后在辅助角色上轮询该队列,运行代码并将生成的文件存储到Blob 存储。

如果您在屏幕截图服务器上的预期负载很低,您可能会使用一个 Extra-Small 实例,这将花费很少。

于 2013-10-14T12:54:58.143 回答
0

更新:在这种情况下,Awesomium 应该是一种选择。

于 2013-10-14T12:39:17.170 回答
0

我发现是否有网络服务/API 可以抓取另一个网站的屏幕截图?并从那里使用开源代码完成任务的服务。对于我们计划做的轻量级用途,这比定制实施的解决方案要好。

于 2013-10-15T07:55:48.303 回答