Как загрузить иконку из набора строк?
От: mDmitriy Россия  
Дата: 14.05.13 05:00
Оценка:
Те, кто писал на Delphi, знает (или помнит), что Delphi сохраняет образы .ico и .bmp, сопоставленные со свойствами компонентов формы, в виде набора строк, например
        Glyph.Data = {
          EE000000424DEE0000000000000076000000280000000F0000000F0000000100
          0400000000007800000000000000000000001000000010000000000000000000
          8000008000000080800080000000800080008080000080808000C0C0C0000000
          FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00111111111111
          1110111111101111111011111100111111101111108011111110111108801111
          111011108880111111101108888000000110108888888888811011F88880FFFF
          F110111F8880111111101111F8801111111011111F8011111110111111F01111
          111011111110111111101111111111111110
        }

Мне эти данные приходят с другого источника.
Вопрос — как этот набор загрузить в 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 тоже...
Re: Как загрузить иконку из набора строк?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.05.13 05:38
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

D>Получаю Exception "Аргумент 'picture' должен быть рисунком, который можно использовать как Icon".


D>Кодировку менять пробовал, загружать в Bitmap тоже...

Кодировка тут непричем. Кодировка это о том, как представлена строка. Здесь же наоборот, строкой представлены байты.
Полагаю что каждые 2 значимых (не whitespace) символа строки представляют байт данных иконки. Нужно развернуть руками. Получившиеся байты могут быть как результатом сохранения иконки в каком-то формате (.ico, .png), либо просто двоичные данные растра (тогда надо не вчитывать иконку из потока, а создавать иконку и заполнять ее пиксели). Склоняюсь ко второму. Но что бы знать наверняка — надо ковыряться в Delphi исходниках, либо в инете.
Одно точно: менять кодировку — тупик.
Re: Как загрузить иконку из набора строк?
От: Аноним  
Дата: 14.05.13 06:12
Оценка:
D>var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(buffer));
Однозначно не так. Смотрел http://stackoverflow.com/questions/321370/convert-hex-string-to-byte-array ?
Re: Как загрузить иконку из набора строк?
От: akasoft Россия  
Дата: 14.05.13 06:29
Оценка: 2 (1)
Здравствуйте, 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();
    }
  }
}
... << RSDN@Home 1.2.0 alpha 5 rev. 66>>
Re[2]: Как загрузить иконку из набора строк?
От: mDmitriy Россия  
Дата: 14.05.13 09:08
Оценка:
Здравствуйте, akasoft, Вы писали:

Спасибо, это работает, но мне приходит вот такая строка
Qk02BAAAAAAAADYAAAAoAAAAEAAAABAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA7Ozs
AJORkQCUi4sAoI6LAJeOjgCVlZgAv7KvAMvGxADAvr4AoZ2dAIyIiQCOiooAj4uLAIqFhQCSjI0A
4N7fALe0tABcVlYAJSUnAAAhMQAAgZAAAI+1AB4zUwBvVk4Ab2loAEpDQgBWUFAAZ2JiAGhhYQBk
X2AAMyssAKunpwDGxMQA0b28AEOLnQAAy+cAAOj/AADI/wAAhuMAKkVeAHBjXwB0bm4AtrSzAL/A
wQCoqKoA8/b4AJORjwCopqIAy8nIALuinwAshp8AANz8AADJ8gAAmuMAAKb/AAJLdwCAc2wAwMPD
AOLo6QDa3+EA09jZAPj6+wCGgoMAp6OiAMzIyAC4o6EAK3eJAACSsgAAUIQAACprAAB9zQAJUoIA
fnaGAMfM3gD///8A////APn//wD///8Agn5+AKejowDJyMcAxL+6AD5FXAAAG2gAADSBAABAigAA
LnIABg8mAC0iSQAtJk8AeHWXAOLm8AD///8A////AIN+fgCno6MAx8XGANDMyABPT18AAEJ0AACe
sgAAosIAADdlAANLWwAsLEwARTBgABAGMAA/PlUAyc3cAP///wCBfH0Ap6KjAMzIyAC+qqoAMGVy
AACy0wAA1f8AAM//AADD7QAA0fgAAXCzACxGfAA0OWsABgIjADY5SwDR1OQAkY6PAKekpQDUzcwA
0LiyAElQVgAAOnIAAEmnAACV4gAA3P8AAMn/AACk/wAAfcQAGy1cACQ3bwAKBikATEdeAGFgaAC1
s7EAp6OmAEhtcwAdqcsAAI/dAAA7dAAAfLQAANr9AADJ/wAWnv8AAHjGABpEdwA0VqMAJjt2AA0K
KAAFAAsAwr29ACdlcgAAzeAAAM7/AACf/wAAlPIAAKjmAADO+wAZ0v8AZuP/ACN/wgAaLnUAPGbU
ADNapwAkPnoADgkpAF5YZQAXa3wAAOr/AADH/wAAof8AAJr/AALF/wArz/8AWu3/ACr//wBQt8UA
eU9wAH+Q3gA0eOEAMFakACY6dAAmIj8AF2t7AAHf/wAMxP8AJcv/ADPT/wBQ5P8AXfn/AB7//wAA
//8ACcO+AKdxUQDQoYMAVXWtADVt2gAxVKEANUt8ACJvdAAH6PsAYeT/AHD1/wAr/v8AJP//AAD/
/wAA2dkAAJiaAFqGgwDsw6QA6M2fANvTtAB7mNwAJmrWAEFhpQCwtLMAHqCeACX//wAS//8AAP//
AADR0QAJn58AOF1dAE03NgCljY0AusLKALK4wgC9u7oAraWdAFJxtgA5b9wA//z8ALCzsQAgeXgA
F3t7ABdubgBOY2MAxbm5AO/d3QDy6OgA6uvrAOLg4ADh3+AA4eDiAOzp4gDi4eEAtsj1AA==

т.е., не хексовая
Re[3]: Как загрузить иконку из набора строк?
От: baranovda Российская Империя  
Дата: 14.05.13 09:10
Оценка: 3 (1) +3
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, akasoft, Вы писали:


D>Спасибо, это работает, но мне приходит вот такая строка


Это уже base64
Re[4]: Как загрузить иконку из набора строк?
От: mDmitriy Россия  
Дата: 14.05.13 09:44
Оценка:
Здравствуйте, baranovda, Вы писали:

B>Здравствуйте, mDmitriy, Вы писали:


D>>Здравствуйте, akasoft, Вы писали:


D>>Спасибо, это работает, но мне приходит вот такая строка


B>Это уже base64

Гениально! Я сам, лошара, мог бы сообразить, увидев два знака == в конце...
            var bytes = Convert.FromBase64String(source);
            var memoryStream = new MemoryStream(bytes);
            return new Bitmap(memoryStream);

Работает, спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.