Как на лету кодить картинки в base64

serjio1112

Client
Регистрация
21.07.2011
Сообщения
42
Благодарностей
7
Баллы
8
Столкнулся с такой вот проблемой. Нужно брать картинку, уникализировать её и закодировать в base64. И, если с 1м заданием вопросов и трудностей не возникло, то насчёт кодировки. Всё облазил, но так и не понял, как это можно сделать. Подскажите, пожалуйста
Картинки берутся локально
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Использовать в C# сниппетах
C#:
// путь к картинке
string Path = project.Variables["image_path"].Value;

using (Image image = Image.FromFile(Path))
{
    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        byte[] imageBytes = m.ToArray();
        return Convert.ToBase64String(imageBytes);
    }
}
 
  • Спасибо
Реакции: serjio1112

serjio1112

Client
Регистрация
21.07.2011
Сообщения
42
Благодарностей
7
Баллы
8
Не работает так
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113

serjio1112

Client
Регистрация
21.07.2011
Сообщения
42
Благодарностей
7
Баллы
8

Geograph

Client
Регистрация
16.02.2014
Сообщения
209
Благодарностей
114
Баллы
43
Использовать в C# сниппетах
C#:
// путь к картинке
string Path = project.Variables["image_path"].Value;

using (Image image = Image.FromFile(Path))
{
    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        byte[] imageBytes = m.ToArray();
        return Convert.ToBase64String(imageBytes);
    }
}
Мне кажется нет смысла открывать файл как картинку, чтобы потом преобразовывать ее в массив байт. Надо сразу открывать файл как массив байт:
C#:
string Path = project.Variables["image_path"].Value;
return Convert.ToBase64String(File.ReadAllBytes(Path));
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
А можно без сохранения на комп кодировать и постить картинку в Телеграм?
Если можно, то как?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
картинки по ссылкам, наверное, по-любому надо скачивать на комп, т.е. так или иначе экономии никакой.
Качаем картинку просто в массив байт, а далее конвертируем байты в base64, и оттуда уже шлём куда надо.
C#:
string url = @"https://zennolab.com/discussion/data/avatars/m/11/11375.jpg?1446968218";
string proxy = "";
string[] headers = new[]{string.Empty};
byte[] imgbytes = ZennoPoster.HTTP.RequestBytes(
  method:ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET,
  url:url,
  content:"",
  contentPostingType:"",
  proxy:proxy,
  AdditionalHeaders: headers,
  cookieContainer: project.Profile.CookieContainer);
return Convert.ToBase64String(imgbytes );
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
  • Спасибо
Реакции: bizzon

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Качаем картинку просто в массив байт, а далее конвертируем байты в base64, и оттуда уже шлём куда надо.
C#:
string url = @"https://zennolab.com/discussion/data/avatars/m/11/11375.jpg?1446968218";
string proxy = "";
string[] headers = new[]{string.Empty};
byte[] imgbytes = ZennoPoster.HTTP.RequestBytes(
  method:ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET,
  url:url,
  content:"",
  contentPostingType:"",
  proxy:proxy,
  AdditionalHeaders: headers,
  cookieContainer: project.Profile.CookieContainer);
return Convert.ToBase64String(imgbytes );
А как теперь сделать POST с картинкой, например:
C#:
string img = @"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";
string strToken = "";
string strChatId = "";
string proxy = "";
string message = "описание";
string mode = "&parse_mode=html";

string data = "--8d769bc78125cd4\n";
data += string.Format("Content-Disposition: form-data; name=\"photo\"; filename=\"{0}\"\n", img);
data += "Content-Type: application/octet-stream\n";
data += img;

string resRequest = ZennoPoster.HttpPost(
"https://api.telegram.org/bot" + strToken + "/sendPhoto?chat_id=" + strChatId+"&caption="+message+mode,
data,"multipart/form-data",proxy,"UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
30000,"","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",true,5,
new[] {"Host: api.telegram.org"});
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
А как теперь сделать POST с картинкой:
[
К сожалению как правильно сформировать multipart, чтобы он был корректно отправлен с массива байт средствами Зенно - я не знаю.
Но, когда-то мне приходилось отправлять таким способом (без сохранения на диск) каптчу в телеграмм.
Поискал по конспектам - нашел вот такой вариант. Исходник брал здесь. Перепроверил - вижу что работает.
Можете использовать, если есть необходимость (или продолжить искать варианты как подружить официальные средства Зенно...).
Нужно добавить ссылку в GAC.
95287
Прописать директивы.
C#:
using System.Net.Http;
using System.Net.Http.Headers;
95289
Использовать в кубике Зенно такой код:
C#:
string strToken = " ";
string strChatId = " ";
string message = "Описание картинки...";
var sBoundary = DateTime.Now.Ticks.ToString("x");
string fileName = "myFile.png"; // выдуманное имя файла...

// Скачивание картинки в массив байт
string url = @"https://zennolab.com/discussion/data/avatars/m/11/11375.jpg?1446968218";
string proxy = "";
string[] headers = new[]{string.Empty};
byte[] fileByteArray = ZennoPoster.HTTP.RequestBytes(  method:ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET,  url:url, content:"", contentPostingType:"",  proxy:proxy,  AdditionalHeaders: headers);

var list_params = new List<string[]>();
    list_params.Add(new[]{"chat_id", strChatId});
    list_params.Add(new[]{"caption", message});
    list_params.Add(new[]{"parse_mode", "html"});

// Формирование ссылки к боту
url = string.Join("?",
    new[]{
        string.Format("https://api.telegram.org/bot{0}/sendPhoto", strToken),
        string.Join("&",list_params.Select(x=>string.Join("=",x)))  
    }
);

var content = new MultipartFormDataContent(sBoundary);
var byteArrayContent = new ByteArrayContent(fileByteArray, 0, fileByteArray.Length);
    byteArrayContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") {
        Name = "photo", FileName = fileName };
    content.Add(byteArrayContent, "photo");

    var client = new HttpClient();
    var response = client.PostAsync(url, content).Result;
    var result = response.Content.ReadAsStringAsync().Result;
    return result.ToString();
Результат примерно такой:

95291
 
Последнее редактирование:
  • Спасибо
Реакции: z@jivalo, bizzon и djaga

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Код:
var content = new MultipartFormDataContent(sBoundary);
var byteArrayContent = new ByteArrayContent(fileByteArray, 0, fileByteArray.Length);
byteArrayContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "photo", FileName = fileName }; 
content.Add(byteArrayContent, "photo");
Может кто-то знает как посмотреть что содержится в этих заголовках?
Хочу на стандартный кубик POST перенести это.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Может кто-то знает как посмотреть что содержится в этих заголовках?
Хочу на стандартный кубик POST перенести это.
Посмотреть что там можно так:
C#:
var content = new MultipartFormDataContent(sBoundary);
var byteArrayContent = new ByteArrayContent(fileByteArray, 0, fileByteArray.Length);
byteArrayContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "photo", FileName = fileName };
content.Add(byteArrayContent, "photo");
return content.ReadAsStringAsync().Result;
Результат:
Код:
--8da770a65ed4a0a
Content-Disposition: form-data; name=photo; filename=myFile.png

byte[]
--8da770a65ed4a0a--
Можно ещё вернуть байты
C#:
var content = new MultipartFormDataContent(sBoundary);
var byteArrayContent = new ByteArrayContent(fileByteArray, 0, fileByteArray.Length);
byteArrayContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "photo", FileName = fileName };
content.Add(byteArrayContent, "photo");
byte[] b = content.ReadAsByteArrayAsync().Result;
И потом можно эти байты отправить через метод Зеннопостера вот так примерно:
C#:
var sBoundary = DateTime.Now.Ticks.ToString("x");
string contenttype = string.Format("multipart/form-data;boundary={0}", sBoundary);

//  тут код собирающий форму...

byte[] b = content.ReadAsByteArrayAsync().Result;
string response = ZennoPoster.HTTP.Request(
  method: ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST,
  url: url,
  content: b, // байты
  contentPostingType: contenttype, // мультипарт с boundary
//  proxy: proxy,
  Encoding: "UTF-8",
  respType:ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
  Timeout: 30000,
  Cookies: string.Empty,
 // UserAgent: UserAgent,
  UseRedirect: false,
  MaxRedirectCount: 0,
  AdditionalHeaders: new[]{ "zennolab: test" },
  DownloadPath: null,
  UseOriginalUrl: true,
  throwExceptionOnError: true,
//  cookieContainer: project.Profile.CookieContainer,
  removeDefaultHeaders: true // Удаляем стандартные заголовки
);
    return response;
Вы хотите избавиться от HttpClient - тогда все что выше в этом сообщении поможет.
Если Вы хотите избавиться от MultipartFormDataContent - тогда возможно каждую строку можно перевести в байты, найти где там начинается и где заканчивается контент, и просто в это место подставлять данные картинки (я такое пока ещё не делал).
Просто объясните чем не подходит вариант использования MultipartFormDataContent?
 
  • Спасибо
Реакции: Dmitriy Ka и bizzon

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Хочу разобраться как собирать MediaGroup в кубик POST.
 
Последнее редактирование:

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