Сжатие веса картинки, создание скриншота Zennoposter / Zennodroid

lutic

Client
Регистрация
20.01.2024
Сообщения
67
Благодарностей
54
Баллы
18
Добрый день

1. Уменьшение веса изображения через c#
2. Создание альтернативного скриншота вместо DrawToBitmap

1. Изначальный размер картинки 1,21 мб, получаем 95кб (0,1мб)
Все мы прекрасно знаем о лимите отправке картинок в 100кб на сервис распознавания капчи, даже capmonster2 имеет данный лимит примерно в 500кб, и при создании скриншотов, мы получаем большие картинки, большого размера
1732330418134.png
А у нас лимит в 100кб, есть скрипт что поможет сжать

Спасибо автору за код https://zenno.club/discussion/threads/stim-i-recaptcha-sitekey-addon.82677/post-736161 , немного модифировав его
C#:
Image image;
byte[] bytes = Convert.FromBase64String(project.Variables["var1"].Value);
using (MemoryStream stream = new MemoryStream(bytes)){  image = Image.FromStream(stream); }            
             
long quality = 80L;
System.Drawing.Imaging.EncoderParameters   encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
System.Drawing.Imaging.ImageCodecInfo codec = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders().FirstOrDefault(c => c.MimeType == "image/jpeg");


MemoryStream mems = new MemoryStream();
image.Save(mems, codec, encoderParameters);

project.Variables["var2"].Value = Convert.ToBase64String(mems.ToArray());
Код берет из переменной var1 данные, и записывает в переменную var2
127694


На выходе получаем
1732330583911.png


2. Создание альтернативного скриншота вместо DrawToBitmap

Для Zennoposter
C#:
var el =  instance.ActiveTab.MainDocument.QuerySelector("img", 0);

if(el != null){
    string getBase64Screen = getScreen(el);
    project.Variables["var1"].Value = getBase64Screen;
}
    string getScreen(HtmlElement el2){

            
            if(el2==null){ return ""; }
            int x1 = el2.DisplacementInBrowser.X; //-200
            int y1 = el2.DisplacementInBrowser.Y;
            int w1 = el2.Width; // 500
            int h1 = el2.Height;

            if(w1>0&&h1>0){


                string base64String = instance.ActiveTab.GetPagePreview();
                if(base64String.Length<1000){ return ""; }
                string base64String2 = "";
                byte[] imageBytes = Convert.FromBase64String(base64String);
                Image image; using (MemoryStream stream = new MemoryStream(imageBytes)){   image = Image.FromStream(stream);  }
              
                if(x1<0){ if((x1+w1)<=0){ return ""; } w1 = x1+w1; x1 = 0; }
                if(y1<0){ if((y1+h1)<=0){ return ""; } h1 = y1+h1; y1 = 0;}
              
                //if(image.Width>w1){ w1 = }
                Bitmap croppedImage = new Bitmap(w1, h1);
              
                
       
              
                using (Graphics g = Graphics.FromImage(croppedImage)){
                    g.DrawImage(image, (new Rectangle(0,0,w1, h1 )),  (new Rectangle(x1, y1,w1, h1 )), GraphicsUnit.Pixel);
                }
              
                using (MemoryStream stream2 = new MemoryStream()){
                     croppedImage.Save(stream2, System.Drawing.Imaging.ImageFormat.Png);
                     imageBytes = stream2.ToArray();
                     base64String2 = Convert.ToBase64String(imageBytes);
                }
                return base64String2;
          
              
            }
              return "";
        }
Для Zennodroid
Спасибо за идею с кодом https://zenno.club/discussion/threads/zd-dobavit-rabotu-so-svojstvami-ehlementa-cherez-c.120294/post-799899
C#:
var tab = instance.DroidInstance;

var driver = tab.AppiumDriver;

var elem = driver.FindElementByXPath("//android.widget.ImageView");

if (elem != null){
    string img = getImageXpath("//android.widget.ImageView");
}

string getImageXpath(string xp){

    //info( instance.DroidInstance.AppiumDriver.FindElementByXPath(xp).GetType().ToString());

    var elem2 = driver.FindElementByXPath(xp);

    if (elem2 == null){ return ""; }

    string bounds = elem2.GetAttribute("bounds");
 
    //bounds = Regex.Replace(bounds, @"\[|\]", ",");
    //string[] parts2 = bounds.Split(',');
    //parts2 = parts2.Where(x => x != null &&  x!="").ToArray();
 
 
    var matches = Regex.Matches(bounds, @"\[(\d+),(\d+)\]");
 
    if (matches.Count == 2){
        // Координаты "углов" элемента
        int x1 = int.Parse(matches[0].Groups[1].Value);
        int y1 = int.Parse(matches[0].Groups[2].Value);
        int x2 = int.Parse(matches[1].Groups[1].Value);
        int y2 = int.Parse(matches[1].Groups[2].Value);
     
     
        var area = new Rectangle(x1, y1, (x2-x1), (y2-y1));
        string b64= tab.Screen.ScreenshotAsBase64String(area);
        project.Variables["var1"].Value  =b64;
        return b64;
     
    }
    return "";
}


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

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