Те, кто писал на Delphi, знает (или помнит), что Delphi сохраняет образы .ico и .bmp, сопоставленные со свойствами компонентов формы, в виде набора строк, например
Мне эти данные приходят с другого источника.
Вопрос — как этот набор загрузить в Icon?
Пытаюсь делать стандартно:
string buffer; // это исходный набор строк в виде одной строки
...
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(buffer));
try
{
var icon = new Icon(memoryStream);
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
Получаю Exception "Аргумент 'picture' должен быть рисунком, который можно использовать как Icon".
Кодировку менять пробовал, загружать в Bitmap тоже...
Здравствуйте, mDmitriy, Вы писали:
D>Получаю Exception "Аргумент 'picture' должен быть рисунком, который можно использовать как Icon".
D>Кодировку менять пробовал, загружать в Bitmap тоже...
Кодировка тут непричем. Кодировка это о том, как представлена строка. Здесь же наоборот, строкой представлены байты.
Полагаю что каждые 2 значимых (не whitespace) символа строки представляют байт данных иконки. Нужно развернуть руками. Получившиеся байты могут быть как результатом сохранения иконки в каком-то формате (.ico, .png), либо просто двоичные данные растра (тогда надо не вчитывать иконку из потока, а создавать иконку и заполнять ее пиксели). Склоняюсь ко второму. Но что бы знать наверняка — надо ковыряться в Delphi исходниках, либо в инете.
Одно точно: менять кодировку — тупик.
Здравствуйте, mDmitriy, Вы писали:
D>Вопрос — как этот набор загрузить в Icon?
Это строковое представление двоичных данных.
По правилам Дельфи первые 4 байта — размер данных, следующих далее.
Всё замечательно преобразуется, например:
using System;
using System.Globalization;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var fs = new FileStream("result.ico", FileMode.Create);
var src = "EE000000424DEE0000000000000076000000280000000F0000000F000000010004000000000078000000000000000000000010000000100000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF001111111111111110111111101111111011111100111111101111108011111110111108801111111011108880111111101108888000000110108888888888811011F88880FFFFF110111F8880111111101111F8801111111011111F8011111110111111F01111111011111110111111101111111111111110";
var len = src.Length / 2;
for (var i = 4; i < len; i++)
{
var b = src.Substring(i*2, 2);
var n = int.Parse(b, NumberStyles.HexNumber);
fs.WriteByte((byte)n);
}
fs.Close();
}
}
}
Здравствуйте, baranovda, Вы писали:
B>Здравствуйте, mDmitriy, Вы писали:
D>>Здравствуйте, akasoft, Вы писали:
D>>Спасибо, это работает, но мне приходит вот такая строка
B>Это уже base64
Гениально! Я сам, лошара, мог бы сообразить, увидев два знака == в конце...
var bytes = Convert.FromBase64String(source);
var memoryStream = new MemoryStream(bytes);
return new Bitmap(memoryStream);