Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> txt->bmp 
:(
    Опции темы
BLACK_KOT
Дата 29.9.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



когда на форму кидаешь картинку делфи сохраняет её в текстовом виде в файле формы .dfm примерно так:
Код

object Image1: TImage
    Left = 352
    Top = 88
    Width = 16
    Height = 16
    Picture.Data = {
      07544269746D617032250000424D322500000000000032010000280000006000
      000060000000010008000000000000240000120B0000120B00003F0000003F00
      00000029A5000839A50018429C000839AD00184294000039AD0029528C000029
      ...
      0B0F10060B0B1D0E0202020E02020E0E0E0E040E120E040E12120E0A0A0D}
  end


 моя прога работает с файлами .dfm , извлекая от туда нужное. например находит описание кнопки, её размеры, свойства, события и генерирует такуюже, только на winapi. как мне из этого текста собрать картинку?

Это сообщение отредактировал(а) BLACK_KOT - 29.9.2010, 13:07


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Snowy
Дата 29.9.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
var
  ms,os: TMemoryStream;
  f:  TForm;
begin
  ms := TMemoryStream.Create; // здесь у нас dfm файл
  os := TMemoryStream.Create; // здесь у нас dfm в бинарном представлении
  Application.CreateForm(TForm, f); // из этой формы мы сделаем то, что прописано в dfm
  ms.LoadFromFile('C:\Unit1.dfm'); // грузим dfm
  ms.Position := 0;
  RegisterClass(TImage); // перед загрузкой формы, нужно зарегестрировать все классы, которые на ней будут
  try
    ObjectTextToBinary(ms, os); // превращаем в бинарный вид
    os.Position := 0;
    os.ReadComponent(f); // грузим dfm на форму
    f.ShowModal; // можем юзать форму - весь dfm в ней - можно разбирать на компоненты
  finally
    os.Free;
    ms.Free;
    f.Free;
  end;

PM MAIL   Вверх
Alexeis
Дата 29.9.2010, 13:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



BLACK_KOT, универсального способа открытия любого dfm файла нет. Каждый компонент может сериализоваться особым способом. 
  Конкретно для битмапа имеем 07 - длина строки определяющая название метакласса, затем сама строка названия ASCII - "TBitmap", затем вероятно размер битмапа в байтах hex - 32 25 00 00 = 9522, после чего идет "BM" сигнатура битмапа. Фактически после размера битмапа в хексе все байты битмапа, которые нужно сконвертировать из текстового представления в бинарное и сохранить на диске.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BLACK_KOT
Дата 29.9.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



Цитата

Фактически после размера битмапа в хексе все байты битмапа, которые нужно сконвертировать из текстового представления в бинарное и сохранить на диске.


всё ясно кроме этого. как мне  сконвертировать из текстового представления в бинарное?

вот конкретная картинка: (целиком)
Код

Picture.Data = {
      07544269746D61707E000000424D7E000000000000003E000000280000001000
      0000100000000100010000000000400000000000000000000000020000000200
      000000000000FFFFFF00FEBF0000F80F746FF0076772E0036869C0016170C001
      000080000D0080000C018000000080000000C0010000C0010000E0030000F007
      FFFFF80FFFFFFFFF0000}


тоесть я должен скопировать: 
                                                            424D7E000000000000003E000000280000001000
      0000100000000100010000000000400000000000000000000000020000000200
      000000000000FFFFFF00FEBF0000F80F746FF0076772E0036869C0016170C001
      000080000D0080000C018000000080000000C0010000C0010000E0030000F007
      FFFFF80FFFFFFFFF0000
и конвертировать этот текст в бинарник. так? подскажите как это сделать


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Snowy
Дата 29.9.2010, 16:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Любой объект из dfm можно сконвертить с помощью ObjectTextToBinary.
И наоборот - ObjectBinaryToText превратит объект, сохранённый в стрим, в его текстовое dfm представление.
Ну, а если вручную, то поочерёдно каждую пару хекс символов поочереди перегоняешь в байт и пишешь в стрим.

Добавлено через 3 минуты и 46 секунд
А смысл расковыривать dfm ручками?
Конвертни его целиком в бинарник, да работай с готовым бинарным стримом.

Добавлено через 11 минут и 35 секунд
Если охота ворочать бинарный стрим ручками, то можешь посмотреть, как это делает TReader - он просто разбирает его на составляющие, вытягивая проперти, классы, имена, значения, стримы и т.д.
Собственно его сама дельфя и юзает.
Это гораздо удобне, чем парсить текст dfm, в котором может быть что угодно, в том числе и не предусмотренное. Тогда твой код собъётся нафиг.
А, парся бинарный стрим, можно просто проскимнуть неизвестные вещи. Там всё пишется единообразно.
Либо пишется фиксированное простое значение, типа integer'a
Либо 2 байта длина, а потом само тело значения,
Либо идёт код начала списка, перечисление значения, код завершения списка.
PM MAIL   Вверх
BLACK_KOT
Дата 29.9.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



спасибо, Snowy


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.