Задать вопрос
@snapoak
Junior frontend developer

Как я могу превратить код в изображение?

У меня есть код вида
<binary id="i_001.png" content-type="image/png">
iVBORw0KGgoAAAANSUhEUgAAAfQAAAH9CAMAAADbB35wAAAAGXRFWHRTb2Z0d2FyZQBBZG9i
ZSBJbWFnZVJlYWR5ccllPAAAABJQTFRF////zMzMmZmZZmZmMzMzAAAA8496aQAAAAF0Uk5T
AEDm2GYAAE7/SURBVHja7F2LQiS7Cmwg+f9fvnbCoyA9uzN7dK6t6fPQdV11h0CgKIrj2M9+

Такая простыня на 2000 строк. Мне нужно представить это в виде изображения, файла. Как это можно сделать? Пишу на C#(wpf). Конкретная задача - вывести изображение ,которое таким образом хранится в *.fb2 файле.
UPD: Я разобрался, как это делать. Код мой проходит онлайн-декодеры и я вижу изображения. Но при попытке декодировать в программе вылезает ошибка:
Недопустимая длина строки или массива знаков Base-64

Код, которым пытаюсь декодировать, вот:
string code = GetBase64CoverImage();
var bytes = Convert.FromBase64String(code);

В режиме отладки смотрю значение переменной code во время появления ошибки - код валидный, проходит декодеры, вижу красивые изображения.
UPD:Строка, которую пытаюсь декодировать, содержит от 100к до 200к символов в среднем. Может в этом проблема?
  • Вопрос задан
  • 4626 просмотров
Подписаться 3 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@kttotto
пофиг на чем писать
На base64 это не похоже, значит обычный набор байтов. Значит строку надо конвертнуть в массив байтов. Ну потом это в поток и либо сохранить в файл, либо отдать дальше куда надо. Примерно как то так
byte[] imageBytes = Encoding.ASCII.GetString(strData);
using(var str = Image.FromStream(new MemoryStream(imageBytes)))
{
    str.Save("image.png", ImageFormat.Png);
}
Ответ написан
Griboks
@Griboks Куратор тега C#
Используя валидную кодировку, перевести код в необходимый формат изображения, например .png, и сохранить его в файле.
Ответ написан
2ord
@2ord
Base64 всегда кодирует исходное сообщение в сообщение длиной, кратной 4, дополняя знаками "=".
Пример на языке Ruby, в режиме интерпретатора в командной строке:
irb(main):020:0> Base64.strict_encode64 'a'
=> "YQ=="
irb(main):021:0> Base64.strict_encode64 'ab'
=> "YWI="
irb(main):022:0> Base64.strict_encode64 'abc'
=> "YWJj"
irb(main):023:0> Base64.strict_encode64 'abcd'
=> "YWJjZA=="
irb(main):024:0> Base64.strict_encode64 'abcde'
=> "YWJjZGU="
irb(main):025:0> Base64.strict_encode64 'abcdef'
=> "YWJjZGVm"

Изображение, закодированное с Base64, раскодируется при помощи буфера, скажем, 16КБ.
В этот буфер нужно поместить данные размером, кратным 4 (при этом, храня истинный размер в отдельной переменной). Декодировал буфер - записывай результат куда нужно (будет содержать бинарные данные изображения) - приступай к чтению следующего куска, и так до конца "простыни".
Так код не будет пожирать много памяти и будет обрабатывать данные поочередно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы