Практичне заняття - Поєднання GScraper та ImageSharp
Як використовувати GScraper?
Офіційний приклад з репозиторію:
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using GScraper;
using GScraper.Google;
namespace GScraperExample
{
internal static class Program
{
private static async Task Main()
{
Console.WriteLine("GScraper Example Program"); // Виведення тексту в консоль про програму прикладу GScraper.
using var scraper = new GoogleScraper(); // Створення об'єкту scraper типу GoogleScraper через using, який автоматично диспоузиться після виходу з області видимості.
while (true) // Безкінечний цикл для отримання запитів користувача.
{
Console.Write("Query (enter 'e' to exit): "); // Виведення тексту запиту в консоль.
string? text = Console.ReadLine(); // Отримання введення користувача з консолі.
if (string.IsNullOrEmpty(text)) // Перевірка на пустий ввід.
continue; // Продовження циклу, якщо ввід порожній.
if (text == "e") // Перевірка на вихід з програми.
break; // Вихід з циклу, якщо введено 'e'.
IEnumerable<IImageResult> images; // Оголошення змінної для збереження списку зображень.
try // Початок блоку спроби.
{
images = await scraper.GetImagesAsync(text); // Отримання списку зображень за допомогою методу GetImagesAsync об'єкту scraper.
}
catch (Exception e) when (e is HttpRequestException or GScraperException) // Обробка винятків, що можуть виникнути під час виконання запиту.
{
Console.WriteLine(e); // Виведення інформації про виняток у консоль.
continue; // Продовження циклу при виникненні винятку.
}
bool enumerateAll = false; // Ініціалізація змінної для переліку всіх зображень.
bool stop = false; // Ініціалізація змінної для припинення переліку зображень.
foreach (var image in images) // Цикл перебору зображень зі списку.
{
Console.WriteLine(); // Порожній вивід у консоль для відділення зображень.
Console.WriteLine(JsonSerializer.Serialize(image, image.GetType(), new JsonSerializerOptions { WriteIndented = true })); // Виведення в консоль інформації про зображення у форматі JSON.
if (!enumerateAll) // Перевірка на перелік всіх зображень.
{
Console.Write("Press 'n' to send the next image, 'a' to enumerate all images and 's' to stop: "); // Виведення тексту запиту на подальші дії користувача.
var key = Console.ReadKey().Key; // Отримання введеного користувачем символу.
Console.WriteLine(); // Перехід на новий рядок у консолі.
switch (key) // Перевірка введеного символу користувача.
{
case ConsoleKey.A: // В разі введення 'a'.
enumerateAll = true; // Позначення переліку всіх зображень.
break;
case ConsoleKey.S: // В разі введення 's'.
stop = true; // Позначення припинення переліку зображень.
break;
default: // У всіх інших випадках.
break;
}
}
if (stop) // Перевірка на потребу в припиненні переліку.
{
break; // Вихід з циклу при необхідності припинення переліку зображень.
}
}
}
}
}
}Цей код представляє програму, яка використовує бібліотеку GScraper для отримання зображень з Інтернету. Вона починає з виведення тексту про програму у консоль. Потім запускається нескінченний цикл, де користувач може вводити запити. Користувач може ввести 'e' для виходу з програми. Програма намагається отримати список зображень за допомогою обраного типу скрапера. Якщо виникає помилка під час отримання зображень, вона виводиться у консоль, і програма продовжує роботу. Потім програма перебирає список отриманих зображень, виводить їх інформацію у форматі JSON у консоль і чекає на введення користувача для подальших дій з кожним зображенням. Користувач може натискати 'n' для переходу до наступного зображення, 'a' для переліку всіх зображень або 's' для припинення перегляду. Програма завершу
Весь код на GoogleDrive:Посилання
Як використовувати GScraper(або любий інший проєкт) у своїй програмі?
Підключення зовнішніх проєктів.
Зв'язок зовнішніх проєктів (.csproj та .sln) з іншим проєктом можна встановити за допомогою інструментів командного рядка (dotnet add) та редагування відповідних файлів.
Команда dotnet add використовується для додавання посилань на зовнішні проєкти до поточного проєкту. Наприклад:
dotnet add reference шлях_до_зовнішнього_проєкту.csprojКрім цього, можна редагувати файли проєкту вручну:
- Для .csproj: Відкрийте файл поточного проєкту (.csproj) у текстовому редакторі та вручну додайте посилання на зовнішній проєкт.
- Для .sln: Відкрийте файл рішення (.sln) у текстовому редакторі та додайте посилання на зовнішній проєкт.
У файлі .csproj можна додати наступний рядок:
<ItemGroup>
<ProjectReference Include="шлях_до_зовнішнього_проєкту.csproj" />
</ItemGroup>У файлі .sln можна додати запис наступного вигляду:
Project("{зовнішній_GUID}") = "Назва_проєкту", "шлях_до_зовнішнього_проєкту.csproj", "{унікальний_GUID}"
EndProjectЦе дозволить підключити зовнішній проєкт до вашого поточного проєкту, щоб ви могли використовувати його функціонал та ресурси у вашому програмному забезпеченні.
Приклад використання GScraper з додатковою бібліотекою для роботи з ним
GScraper - призначення та використання.
Пояснення роботи класів:
ScrapConfigтаScrapImageConfig:ScrapConfigвизначає конфігурацію для скрапінгу і містить список об'єктівScrapImageConfig.ScrapImageConfigмістить налаштування для пошуку конкретного типу зображень, такі як назва, кількість зображень для завантаження та формат імені файлу.
ScrapHendler:ScrapHendlerпризначений для використанняGoogleScraperта інших функцій для скрапінгу та завантаження зображень за заданою конфігурацією.- Метод
ScrapByScapConfigцього класу приймає конфігурацію та вивідний каталог, створює папку виведення, і потім циклом скрапить та завантажить зображення для кожної конфігурації зі списку. SearchForImageвикористовуєGoogleScraperдля пошуку зображень за заданим текстом, вибирає доmaxReturnCountзображень та повертає їх URL.DownloadFileByURLзавантажує файл за заданим URL, використовуючиHttpClient, та зберігає його за вказаним шляхом та ім'ям файлу.
Як використовувати ці класи:
- Створіть об'єкт
ScrapConfigта додайте до нього об'єктиScrapImageConfigз необхідними налаштуваннями. - Ініціалізуйте
GoogleScraperта створіть об'єктScrapHendler, передаючи йомуGoogleScraper. - Викличте метод
ScrapByScapConfig, передаючи йому створенийScrapConfigта шлях для виведення.
Приклад використання:
class Program
{
static void Main(string[] args)
{
// Створення та конфігурація для скрапінгу
ScrapConfig scrapConfig = new ScrapConfig();
scrapConfig.scrapImageConfigs.Add(new ScrapImageConfig("desert wallpaper", 5));
scrapConfig.scrapImageConfigs.Add(new ScrapImageConfig("Strv 103B", 3));
scrapConfig.scrapImageConfigs.Add(new ScrapImageConfig("Amx Elc Bis", 3));
// Ініціалізація скрапера та обробника скрапінгу
GoogleScraper scraper = new GoogleScraper();
ScrapHendler scrapHendler = new ScrapHendler(scraper);
// Виклик методу для скрапінгу за заданою конфігурацією та шляхом виводу
scrapHendler.ScrapByScapConfig(scrapConfig, "output_folder");
}
}Весь код на GoogleDrive:Посилання
Приклад використання бібліотеки ImageSharp у поєднанні з SimpleImageSharp
ImageSharp у поєднанні з SimpleImageSharp.
Код проєкту:
Наповнення файлу SimpleImageSharpExample.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.0" />
</ItemGroup>
</Project>Наповнення файлу Program.cs:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.Fonts;
using SimpleImageSharp;
class Program
{
static void Main()
{
// Завантаження зображення
using Image image = Image.Load("input.png");
// Визначення параметрів прямокутника
Pen pen = Pens.Solid(Color.Green, 20);
Rectangle react = new Rectangle(image.Width / 2, image.Height / 2, 200, 200);
// Малювання прямокутника
SimpleImageSharpUtils.DrawRectangle(image, pen, react, true);
// Визначення параметрів тексту
FontCollection collection = new();
FontFamily family = collection.Add("Hack-Regular.ttf");
Font font = family.CreateFont(50, FontStyle.Italic);
// Додавання тексту на зображення
SimpleImageSharpUtils.DrawText(image, "test, fellas, just a test", font, Color.Red, image.Width / 2, image.Height / 2);
// Додавання тексту із зазначенням шрифту
SimpleImageSharpUtils.DrawTextHandleFont(image, "test, fellas, just a test (second)", "Hack-Regular.ttf", 10, Color.Red, image.Width / 2, image.Height / 2);
// Масштабування зображення
SimpleImageSharpUtils.ScaleImage(image, 1.5);
// Збереження результату
image.Save("output.png");
}
}Наповнення файлу SimpleImageSharp.cs:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.Fonts;
namespace SimpleImageSharp
{
public class SimpleImageSharpUtils
{
public static void DrawRectangle(Image image, Pen pen, Rectangle react, bool center)
{
Rectangle drawRectangle;
if (center)
{
drawRectangle = new Rectangle(react.X - react.Width / 2, react.Y - react.Height / 2, react.Width, react.Height);
}
else
{
drawRectangle = new Rectangle(react.X, react.Y, react.Width, react.Height);
}
image.Mutate(x => x.Draw(pen, drawRectangle));
}
public static void DrawText(Image image, string text, Font font, Color color, int x, int y)
{
Point point = new Point(x, y);
image.Mutate(x => x.DrawText(text, font, color, point));
}
public static void DrawTextHandleFont(Image image, string text, string fontPath, int fontSize, Color color, int x, int y)
{
FontCollection collection = new();
FontFamily family = collection.Add(fontPath);
Font font = family.CreateFont(fontSize, FontStyle.Italic);
DrawText(image, text, font, color, x, y);
}
public static void ResizeImage(Image image, int newWidth, int newHeight)
{
image.Mutate(x => x.Resize(newWidth, newHeight));
}
public static void ScaleImage(Image image, double fraction)
{
image.Mutate(x => x.Resize(Convert.ToInt32(image.Width * fraction), Convert.ToInt32(image.Height * fraction)));
}
public static void ToGrayscale(Image image)
{
image.Mutate(x => x.Grayscale());
}
}
}Для роботи програми необхідні наступні файли:
1 - Шрифт (Hack-Regular.ttf)
2 - Зображення (input.png)
Приклад використання бібліотеки ImageSharp у поєднанні з SimpleImageSharp
ImageSharp у поєднанні з SimpleImageSharp.
Код проєкту:
Наповнення файлу SimpleImageSharpExample.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.0" />
</ItemGroup>
</Project>Наповнення файлу Program.cs:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.Fonts;
using SimpleImageSharp;
class Program
{
static void Main()
{
// Завантаження зображення
using Image image = Image.Load("input.png");
// Визначення параметрів прямокутника
Pen pen = Pens.Solid(Color.Green, 20);
Rectangle react = new Rectangle(image.Width / 2, image.Height / 2, 200, 200);
// Малювання прямокутника
SimpleImageSharpUtils.DrawRectangle(image, pen, react, true);
// Визначення параметрів тексту
FontCollection collection = new();
FontFamily family = collection.Add("Hack-Regular.ttf");
Font font = family.CreateFont(50, FontStyle.Italic);
// Додавання тексту на зображення
SimpleImageSharpUtils.DrawText(image, "test, fellas, just a test", font, Color.Red, image.Width / 2, image.Height / 2);
// Додавання тексту із зазначенням шрифту
SimpleImageSharpUtils.DrawTextHandleFont(image, "test, fellas, just a test (second)", "Hack-Regular.ttf", 10, Color.Red, image.Width / 2, image.Height / 2);
// Масштабування зображення
SimpleImageSharpUtils.ScaleImage(image, 1.5);
// Збереження результату
image.Save("output.png");
}
}Наповнення файлу SimpleImageSharp.cs:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.Fonts;
namespace SimpleImageSharp
{
public class SimpleImageSharpUtils
{
public static void DrawRectangle(Image image, Pen pen, Rectangle react, bool center)
{
Rectangle drawRectangle;
if (center)
{
drawRectangle = new Rectangle(react.X - react.Width / 2, react.Y - react.Height / 2, react.Width, react.Height);
}
else
{
drawRectangle = new Rectangle(react.X, react.Y, react.Width, react.Height);
}
image.Mutate(x => x.Draw(pen, drawRectangle));
}
public static void DrawText(Image image, string text, Font font, Color color, int x, int y)
{
Point point = new Point(x, y);
image.Mutate(x => x.DrawText(text, font, color, point));
}
public static void DrawTextHandleFont(Image image, string text, string fontPath, int fontSize, Color color, int x, int y)
{
FontCollection collection = new();
FontFamily family = collection.Add(fontPath);
Font font = family.CreateFont(fontSize, FontStyle.Italic);
DrawText(image, text, font, color, x, y);
}
public static void ResizeImage(Image image, int newWidth, int newHeight)
{
image.Mutate(x => x.Resize(newWidth, newHeight));
}
public static void ScaleImage(Image image, double fraction)
{
image.Mutate(x => x.Resize(Convert.ToInt32(image.Width * fraction), Convert.ToInt32(image.Height * fraction)));
}
public static void ToGrayscale(Image image)
{
image.Mutate(x => x.Grayscale());
}
}
}Для роботи програми необхідні наступні файли:
1 - Шрифт (Hack-Regular.ttf)
2 - Зображення (input.png)
build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse