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

  • Автор темы Автор темы lutic
  • Дата начала Дата начала

lutic

Client
Регистрация
20.01.2024
Сообщения
97
Реакции
92
Баллы
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




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

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