[Решено] Как получить jpg из xml

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Как получить jpg из xml

Сообщение rustem » 16.04.2012 09:45:08

Laazarus 0.9.30.4 fpc 2.6.0
Имеется xml в котором сохранена картинка в виде /9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMgAA/+4ADkFkb2JlAGTAAAAAAf подскажите пожалуйста как ее достать и отобразить. Вот какой у меня код, но он возвращает ошибку JPEG Error.(((
Код: Выделить всё
procedure TForm1.ImagePaint (Node:TDOMNode);
var
  jpg : TJpegImage = nil;
  sJpg : TStringStream;
begin
  sJpg := TStringStream.Create(Node.FirstChild.NodeValue);
  jpg := TJpegImage.Create;
  jpg.LoadFromStream(sJpg);
  Image1.Picture.Assign(jpg);
  //Image1.Picture.LoadFromStream(sJpg);
  jpg.Free;
end;

xml в utf8
rustem
незнакомец
 
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25

Re: Как получить jpg из xml

Сообщение Odyssey » 16.04.2012 10:53:40

При хранении в XML бинарные файлы кодируются в Base64, и их нужно раскодировать. Например, как-то так (код на компилируемость и работоспособность не проверял):
Код: Выделить всё
uses {...}, Base64;
// ...
var
  JpegStream: TMemoryStream;
  Source: TStringStream;
  Decoder: TBase64DecodingStream
  JpegImage: TJpegImage;
// ...

JpegStream := TMemoryStream.Create;
try
  Source := TStringStream.Create(Node.FirstChild.NodeValue);
  Decoder := TBase64DecodingStream.Create(Source, bdmMIME);
  JpegStream.CopyFrom(Decoder, Decoder.Size);
  FreeAndNil(Source);
  FreeAndNil(Decoder);
 
  JpegImage := TJpegImage.Create;
  JpegImage.LoadFromStream(JpegStream);
  Image1.Picture.Assign(JpegImage);
  FreeAndNil(JpegImage);
finally
  FreeAndNil(JpegStream);
end;
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Как получить jpg из xml

Сообщение rustem » 16.04.2012 11:19:07

Спасибо за быстрый ответ!
Код компилируется, ошибка исчезла, изображения все равно нет)))) ну теперь хоть знаю куда копать))

Добавлено спустя 13 минут 15 секунд:
Еще раз спасибо большое. Вот если кому пригодиться:
Код: Выделить всё
procedure TForm1.ImagePaint (Node:TDOMNode);
var
  Source: TStringStream;
  JpegImage: TJpegImage;
begin
  Source := TStringStream.Create(DecodeStringBase64(Node.FirstChild.NodeValue));
  JpegImage := TJpegImage.Create;
  JpegImage.LoadFromStream(Source);
  FreeAndNil(Source);
  Image1.Canvas.Draw(100,100,JpegImage);
  FreeAndNil(JpegImage);
end;
rustem
незнакомец
 
Сообщения: 9
Зарегистрирован: 16.04.2012 09:00:25


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 227

Рейтинг@Mail.ru