Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2013, 12:39   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Изображение из XML в TImage

Здравствуйте!
В книгах FB2 (обычный XML-формат) изображения хранятся в текстовом виде, обрамлены тэгом binary:
Код:
<binary id="cover.jpg" content-type="image/jpeg">/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQo
.....
.....
MmaNd8wHygJnj24qGNy8LbsZUgg454oooGSNEpudnO04OM9Kj3kb04IVgOe496KKBCCV8D5m</binary>
В аналогичном виде изображения сохраняет и сама делфя в dfm файлах:
Код:
 object Image1: TImage
      Left = 0
      Top = 0
      Width = 1121
      Height = 45
      Align = alClient
      Picture.Data = {
        0954474946496D616765D2010
        .....
        .....
        6CD20003B}
Возможно, кто-нибудь уже сталкивался с подобным или знает в какую сторону нужно рыть. Суть в следующем. Имея в текстовом виде изображение (достали из хмл-ки) преобразовать каким-либо чудом и загрузить его в компонент TImage. Можно ли так сделать? И если да, то каким образом?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 12.11.2013, 13:17   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Прям чудом Там в формате Base64. В Д7:
Код:
var xOutStr: TMemoryStream;
    xInStr: TStringStream;
//xNode - binary-node
  xOutStr:=TMemoryStream.Create;
  xInStr:=TStringStream.Create(xNode.Text);
  DecodeStream(xInStr,xOutStr);
//в xOutStr двоичный jpg или что там
//DecodeStream в EncdDecd
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.11.2013, 18:33   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, спасибо, конечно. Но что-то или я недопонял, или у меня не так работает. Как перекодировать - это ладно. Но сама суть вопроса, как этот код нажатием баттона, или по любому другому вызову отобразить картинкой в TImage:
Код:
        0954474946496D616765D201000047494638396111002D00D50000C4C4C4C3C3
        C3C2C2C2C1C1C1C0C0C0BFBFBFBEBEBEBDBDBDBCBCBCBBBBBBBABABAB9B9B9B8
        B8B8B7B7B7B6B6B6B5B5B5B3B3B3B2B2B2B1B1B1B0B0B0AFAFAFADADADABABAB
        AAAAAAA9A9A9A8A8A8A6A6A6A5A5A5A4A4A4A3A3A3A2A2A2A0A0A09F9F9F9E9E
        9E9D9D9D9B9B9B9A9A9A99999997979700000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000002C00000000
        11002D000006F7408070482C1A8FC68072C96C2A05D0A8740A1D58AFD8AC76AB
        2578BFE0B0B7402E9BCF64837ACD6EAB0FF0B87C0E47D8EFF8BC3DC1EFFBFF7C
        0A82838485820B88898A8B880C8E8F90918E0D94959697940E9A9B9C9D9A0FA0
        A1A2A3A010A6A7A8A9A611ACADAEAFAC12B2B3B4B5B213B8B9BABBB814BEBFC0
        C1BE15C4C5C6C7C416CACBCCCDCA17D0D1D2D3D018D6D7D8D9D619DCDDDEDFDC
        1AE2E3E4E5E21BE8E9EAEBE81CEEEFF0F1EE1DF4F5F6F7F41EFAFBFCFDFA1F00
        030A1C48B020411008132A5C883084C38710233A1441B1A2C58B144768DCC8B1
        A3C78F1E49881C49B2A4C8122853AA5CC9B2254B133063CA9C49B326CD20003B
Простое присвоение этого кода строковому потоку и потом загрузка его в качестве картинки выдает ошибку.
Код:
var 
    xInStr: TStringStream;
begin
  xInStr:=TStringStream.Create(Memo1.Text);
  Image1.Picture.Bitmap.LoadFromStream(xInStr);
  xInstr.free;
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 13.11.2013 в 18:35.
DIgorevich вне форума Ответить с цитированием
Старый 13.11.2013, 19:16   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
<binary id="cover.jpg" content-type="image/jpeg"
явно не через TBitmap грузить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2013, 19:28   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Цитата:
Сообщение от DIgorevich Посмотреть сообщение
Простое присвоение этого кода строковому потоку и потом загрузка его в качестве картинки выдает ошибку.
Так это же не просто строка, это хексы записанные символами. Каждые 2 хекса - байт. Лучше в мемористрим их положить создавая байты из двухексов, потом и грузить.
phomm вне форума Ответить с цитированием
Старый 13.11.2013, 19:35   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Резкость на DecodeStream наведите в #2
и потом
Код:
  xJpeg:=TJPEGImage.Create;
  xJpeg.LoadFromStream(xOutStr);
  Image.Picture.Bitmap.Assign(xJpeg);
  xOutStr.Free;
  xInStr.Free;
  xJpeg.Free;
TJPEGImage в JPEG

PS

в dfm кстати другое - там просто hex-формат
В FB2 - BASE64


2 PS

Та текстовая строка, что в #3, это не содержимое binary-node из fb2, а нечто в hex
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.11.2013 в 20:02.
Аватар вне форума Ответить с цитированием
Старый 13.11.2013, 20:38   #7
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, резкость навел - не особо помогло. Вот я в #3 поэтому и сделал уточнение, мол, пока без преобразования из BASE64, а просто возьмем за исходник чистый HEX. Описываю последовательность действий:
Создал проект, добавил Image1, загрузил в нее картинку формат jpg и сохранил проект. Далее открыл файл dfm, взял оттуда hex-код картинки (содержимое Picture.Data = {}). Создал новый проект, кинул Image, Memo, Button. В Memo вставил hex-код картинки. По нажатию кнопки:
Код:
var
    xInStr: TStringStream;
    xJpeg: TJPEGImage;
begin
  xInStr:=TStringStream.Create(memo1.text);
  xJpeg:=TJPEGImage.Create;
  xJpeg.LoadFromStream(xInStr);
  Image1.Picture.Bitmap.assign(xJpeg);
  xInStr.Free;
  xJpeg.Free;
В итоге, ошибка "JPEG error #42" - картинка пуста.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 13.11.2013, 20:52   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот проектик набросал с fb2 и без обработки критических ситуаций, а там их полно если что

PS 1
Цитата:
hex-код картинк
нельзя в имидж загружать

PS 2

В fb2 и png бывает если не ошибаюсь
Вложения
Тип файла: zip Новая папка (7).zip (407.5 Кб, 78 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.11.2013 в 20:57.
Аватар вне форума Ответить с цитированием
Старый 13.11.2013, 20:57   #9
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, огромное спасибо!

ПС не по теме: постоянно не дает в репутацию ставить что-нибудь, пишет "Вы должны добавить еще кому-нибудь...." хотя я разным людям пытаюсь.
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 13.11.2013 в 21:01.
DIgorevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите как добавить изображение со сканера в TImage Herly Общие вопросы Delphi 68 12.11.2024 14:41
TImage, Canvas, Pixels. пропадает изображение J1Mmy Мультимедиа в Delphi 7 29.07.2013 22:59
C#. Парсинг XML-файла с использованием библиотеки System.xml.linq Gift020 Помощь студентам 5 04.04.2013 13:44
программа, которая должна находить в данной директории *.xml файлы и переименовывать в *.xml.dt. (Delphi) nice.name Помощь студентам 2 09.01.2013 15:40