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; } }