示例#1
0
        public static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("Please provide a Uri as a Command Line Argument!");
                Console.WriteLine("Example Use:");
                Console.WriteLine("WebImageExtracter.exe \"https://google.com\"");
                return;
            }

            string uri = args[0];

            string exePath    = Process.GetCurrentProcess().MainModule.FileName;
            string exeDir     = Path.GetDirectoryName(exePath);
            string outputPath = Path.Combine(exeDir, "Output");

            Directory.CreateDirectory(outputPath);
            Utils.ClearDirectory(outputPath);

            Console.WriteLine("Extracting Images ...");
            ExtractionSettings     settings = new ExtractionSettings(false, false, true, true, 3);
            IEnumerable <WebImage> images   = Extractor.GetAllImages(uri, settings).Result;

            int i = 0;

            foreach (WebImage image in images)
            {
                string outputFilePath = Path.Combine(outputPath, $"{i}.{Enum.GetName(typeof(MagickFormat), image.GetImageIfDownloaded().Format).ToLower()}");
                if (image.GetImageIfDownloaded().Format != MagickFormat.Svg)
                {
                    image.GetImageIfDownloaded().Write(outputFilePath, image.GetImageIfDownloaded().Format);
                }
                else
                {
                    // MagickImage.Write would rasterize svgs which is not what we want
                    // Instead just download to a file
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(image.Uri);
                    request.Method = "GET";
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                        {
                            string       responseText = reader.ReadToEnd();
                            StreamWriter writer       = new StreamWriter(outputFilePath, false);
                            writer.Write(responseText);
                            writer.Close();
                        }
                    }
                }

                i++;
            }

            Console.WriteLine("Finished");
        }
        public async void SearchPressed()
        {
            displayImages  = new List <DisplayImage>();
            spinnerDisplay = "block";

            ExtractionSettings settings = new ExtractionSettings(true, SvgOnly, RecurseUri, RecurseHyperlinks, 1)
            {
                HttpClient           = Http,
                UseCorsAnywhere      = true,
                DisableValidityCheck = true,
            };

            settings.OnFoundImage += async(WebImage image) =>
            {
                // Note: Magick.NET isn't full compatible with Blazor so instead we can download the image directly

                string uri = GetCorsAnywhereUri(image);
                if (IsSvg(uri))
                {
                    string svgContent = await Http.GetStringAsync(uri);

                    if (!string.IsNullOrEmpty(svgContent))
                    {
                        HtmlDocument doc = new HtmlDocument();
                        doc.LoadHtml(svgContent);
                        if (doc != null)
                        {
                            HtmlNode node = doc.DocumentNode.SelectSingleNode("//svg");
                            if (node != null)
                            {
                                node.Attributes.Add("width", "300");
                                node.Attributes.Add("height", "300");
                                displayImages.Add(new DisplayImage()
                                {
                                    Link       = image.Uri,
                                    IsSvg      = true,
                                    SvgContent = node.OuterHtml,
                                });
                            }
                        }
                    }
                }
                else
                {
                    // Get Pixel Data
                    byte[] imageBytes = await Http.GetByteArrayAsync(uri);

                    displayImages.Add(new DisplayImage()
                    {
                        Link             = image.Uri,
                        IsSvg            = false,
                        EncodedPixelData = Convert.ToBase64String(imageBytes),
                    });
                }

                showImages = true;
                StateHasChanged();
            };

            switch (selectedExtractMode)
            {
            case "Extract All Images":
                await Extractor.GetAllImages($"https://{EnteredUri}", settings);

                break;

            case "Favicons Only":
                await Extractor.GetFavicons($"https://{EnteredUri}", settings);

                break;

            case "Apple Touch Icons Only":
                await Extractor.GetAppleTouchIcons($"https://{EnteredUri}", settings);

                break;
            }

            spinnerDisplay = "none";
            showImages     = true;
            StateHasChanged();
        }
        private async void SearchButtonPressed(object sender, RoutedEventArgs e)
        {
            if (!UrlInput.Text.StartsWith("http://") && !UrlInput.Text.StartsWith("https://"))
            {
                ErrorText.Visibility      = Visibility.Visible;
                LoadingSpinner.Visibility = Visibility.Collapsed;
                return;
            }

            ErrorText.Visibility      = Visibility.Collapsed;
            LoadingSpinner.Visibility = Visibility.Visible;

            ExtractionSettings settings = new ExtractionSettings()
            {
                SvgOnly                   = false,
                RecurseUri                = true,
                RecurseHyperlinks         = true,
                HyperlinkRecursionDepth   = 3,
                LazyDownload              = true,
                GetMetaTagImages          = true,
                GetLinkTagImages          = true,
                GetInlineBackgroundImages = true,
                UseCorsAnywhere           = false,
                DisableValidityCheck      = false,
            };

            settings.OnFoundImage += async(WebImage image) =>
            {
                try
                {
                    MagickImage img = await image.GetImageAsync();

                    if (img.Format != MagickFormat.Svg)
                    {
                        if (img.Width < 64 || img.Height < 64 || img.Width > 512 || img.Height > 512)
                        {
                            return;
                        }

                        var size = new MagickGeometry(256, 256);
                        size.IgnoreAspectRatio = false;
                        img.Resize(size);
                        MagickColor mc = new MagickColor(0, 0, 0, 0);
                        img.Transparent(mc);
                        img.Format = MagickFormat.Bmp;
                    }
                    else
                    {
                        Density     de = new Density(256, 256);
                        MagickColor mc = new MagickColor(0, 0, 0, 0);
                        img.Transparent(mc);
                        img.Density = de;
                        img.Settings.TextAntiAlias = true;
                        img.Format = MagickFormat.Bmp;
                    }

                    byte[]      bytes       = img.ToByteArray();
                    BitmapImage bitmapImage = LoadImage(bytes);

                    ListBoxItem boxItem      = new ListBoxItem();
                    Image       imageControl = new Image();
                    imageControl.Width  = 96;
                    imageControl.Height = 96;
                    imageControl.Source = bitmapImage;
                    boxItem.Content     = imageControl;
                    boxItem.Selected   += (s, args) =>
                    {
                        window.SelectedWebsiteImage(img, shortcutControl);
                        Close();
                    };
                    ImageParent.Items.Add(boxItem);
                }
                catch (Exception)
                {
                }
            };

            ImageParent.Items.Clear();

            if (cancellationTokenSource != null)
            {
                cancellationTokenSource.Cancel();
            }

            numRunning++;
            cancellationTokenSource = new CancellationTokenSource();
            try
            {
                await Extractor.GetAllImages(UrlInput.Text.Trim(), settings, cancellationTokenSource.Token);
            } catch (Exception)
            {
            }

            numRunning--;
            if (numRunning == 0)
            {
                LoadingSpinner.Visibility = Visibility.Collapsed;
            }
        }