Объединение несколько картинок в одну

lutic

Client
Регистрация
20.01.2024
Сообщения
71
Благодарностей
62
Баллы
18
Добрый день
Для решение капчи иногда требуется отправить 2 картинки или один скриншот, и чтобы уменьшить нагрузку на процессор приходится уходить от создания создания скриншотов в пользу производительности
131990

Ранее делался скриншот и отправлялся в капча сервисы для получение результата, то сейчас получаем 2 картинки, одну основную и блок из нескольких картинок надо объединить в одну картинку
131991


Это можно сделать с помощью кода

C#:
Tab tab = instance.ActiveTab;
Document doc2 = tab.AllDocuments.Documents[0]; //doc2 = null;
void info(string word) { project.SendInfoToLog(word.ToString(), "[CapGuru][PP]", true); }

var items2 = doc2.QuerySelectorAll(".geetest_box_wrap[style*=block] .geetest_ques_back img");
if (items2 != null && items2.Count > 0)
{
    Bitmap combinedImage = null;
    Image image;
    List<string> slist = new List<string>();
    int i12 = 0;

    // Определяем максимальные размеры
    int maxWidth = 0;
    int maxHeight = 0;

    foreach (var item in items2)
    {
        string img33 = item.GetAttribute("src");
        var captcha = getu2(img33);
        byte[] imageBytes = Convert.FromBase64String(captcha);

        using (MemoryStream stream = new MemoryStream(imageBytes))
        {
            image = Image.FromStream(stream);
            if (image.Width > maxWidth) maxWidth = image.Width;
            if (image.Height > maxHeight) maxHeight = image.Height;
        }
    }

    // Создаем combinedImage с максимальными размерами
    combinedImage = new Bitmap(maxWidth * items2.Count, maxHeight);
    using (Graphics g = Graphics.FromImage(combinedImage))
    {
        g.Clear(Color.White);
    }

    // Приводим все изображения к максимальным размерам и объединяем их
    foreach (var item in items2)
    {
        string img33 = item.GetAttribute("src");
        var captcha = getu2(img33);
        byte[] imageBytes = Convert.FromBase64String(captcha);

        using (MemoryStream stream = new MemoryStream(imageBytes))
        {
            image = Image.FromStream(stream);
        }

        // Приводим изображение к максимальным размерам
        Bitmap resizedImage = new Bitmap(maxWidth, maxHeight);
        using (Graphics g = Graphics.FromImage(resizedImage))
        {
            g.Clear(Color.White);
            g.DrawImage(image, 0, 0, maxWidth, maxHeight);
        }

        // Рисуем изображение на combinedImage в правильном положении
        using (Graphics g = Graphics.FromImage(combinedImage))
        {
            g.DrawImage(resizedImage, i12 * maxWidth, 0);
        }

        i12++;
    }

    if (combinedImage != null)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            combinedImage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            var imageBytes = stream.ToArray();
            // Предполагается, что project.Variables["var2"] существует
            project.Variables["var2"].Value = Convert.ToBase64String(imageBytes);
        }
    }
    else
    {
        info("combinedImage is null");
    }
}
else
{
    info("No images found");
}


string getu2(string url){
            string[] headers = new[]{string.Empty};
            byte[] imgbytes = ZennoPoster.HTTP.RequestBytes(method:ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET, url:url, content:"",contentPostingType:"", AdditionalHeaders: headers);    
            return imgbytes != null && imgbytes.Length > 0?Convert.ToBase64String(imgbytes):"";
        }
В итоге получаем из нескольких картинок одну в base64 и отправляем вместе с основной картинкой как задание для распозование капчи
131992




Спасибо за внимание!
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 874
Благодарностей
2 588
Баллы
113
Спасибо что поделились решением, которое делает из нескольких картинок одну.
Сразу код себе скопировал на будущее!
 

AntonBust

Client
Регистрация
27.03.2025
Сообщения
6
Благодарностей
1
Баллы
3
Можешь пожалуйста вкратце объяснить как ты получил строку кода под номером 5?
5я строка кода:
var items2 = doc2.QuerySelectorAll(".geetest_box_wrap[style*=block] .geetest_ques_back img");
Вроде понимаю, что это регулярка должна быть для сбора картинок но как ты её собрал? Или это формат для приблуды
QuerySelectorAll() ?
 

lutic

Client
Регистрация
20.01.2024
Сообщения
71
Благодарностей
62
Баллы
18
Можешь пожалуйста вкратце объяснить как ты получил строку кода под номером 5?
5я строка кода:
var items2 = doc2.QuerySelectorAll(".geetest_box_wrap[style*=block] .geetest_ques_back img");
Вроде понимаю, что это регулярка должна быть для сбора картинок но как ты её собрал? Или это формат для приблуды
QuerySelectorAll() ?
132142
 
  • Спасибо
Реакции: AntonBust

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)