Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.03.2013, 00:14
Аватар для darktmlr
darktmlr darktmlr вне форума
Прохожий
 
Регистрация: 12.07.2010
Адрес: Северодвинск
Сообщения: 19
Версия Delphi: 7, 2010
Репутация: 10
Лампочка XML + картинка

Подскажите пожалуйстя кто знает. нужно наряду с разными параметрами сохранить картинку в XML. Искала информацию и ничего конкретного не нашла.
Пишут только что можно с помощью потока преобразовав его в строку, но в этом случае действуют ограничения размера типа String, а картинку нужно хранить большую ~300кб. Тут же пишут что с помошью компанентов Indy нужно преобразовать String в String base64.
Ответить с цитированием
  #2  
Старый 07.03.2013, 00:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,064
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тип String может быть длинной до 2Гб (теоретически). Лично я больше чем 2 Мб не делал. Такую строку можно в xml хранить в CDATA (http://www.w3schools.com/xml/xml_cdata.asp)
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
darktmlr (07.03.2013)
  #3  
Старый 07.03.2013, 00:35
Аватар для darktmlr
darktmlr darktmlr вне форума
Прохожий
 
Регистрация: 12.07.2010
Адрес: Северодвинск
Сообщения: 19
Версия Delphi: 7, 2010
Репутация: 10
По умолчанию

Работаю с Delphi 2010. И на сколько я понимаю там явное ограничение на String. В Timage метод SaveToStream... чем еще воспользоваться не знаю. И вот как взять картинку из компонента и записать с помощью TXMLFile... с помощью потока или чего-то еще...
Ответить с цитированием
  #4  
Старый 07.03.2013, 01:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от darktmlr
Работаю с Delphi 2010. И на сколько я понимаю там явное ограничение на String...
Шутишь? Нет там никакого ограничения, кроме указанного выше (2Гб) и прочитай всё-таки приведённую ссылку.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
darktmlr (07.03.2013)
  #5  
Старый 07.03.2013, 11:08
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

В nativeXML картинка в base64 кодируется, причем он делает все сам, только картинку передавай нужную.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 07.03.2013, 11:33
Аватар для darktmlr
darktmlr darktmlr вне форума
Прохожий
 
Регистрация: 12.07.2010
Адрес: Северодвинск
Сообщения: 19
Версия Delphi: 7, 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
В nativeXML картинка в base64 кодируется, причем он делает все сам, только картинку передавай нужную.

как передавать можно пример?

Нашла в интернете методы для класса TStream двух авторов. Ниже они объединены


В строку и обратно переводится, но видимо некорректно ибо из конечного потока ....Picture.LoadFromStream возникает ошибка В идеале было бы без преобразований записать и считать в XML... помогите плз

Код:
Type

  TmStream = class(TMemoryStream)
  public
    procedure LoadFromString(AText: String);
    function SaveToString: String;

    function ToHexStr: string;
    procedure LoadFromHexStr(const Hex: string);
  end;

implementation

{ TmStream }

procedure TmStream.LoadFromString(AText: String);
begin
  Clear;
  if Length(AText) = 0 then
    Exit;
  SetSize(Length(AText) div 2);
  HexToBin(PWideChar(AText), PAnsiChar(Self.Memory), Length(AText) div 2);
  Position := 0;
end;

function TmStream.SaveToString: String;
begin
  SetLength(Result, Size * 2);
  BinToHex(PAnsiChar(Self.Memory), PWideChar(Result), Size);
end;

function TmStream.ToHexStr: string;
const
  Convert: array [0 .. 15] of Char = '0123456789ABCDEF';
var
  i, p: integer;
  B: byte;
  Buf: TStream;
begin
  Buf := Self;
  SetLength(Result, Buf.Size * 2);
  p := Buf.Position;
  Buf.Position := 0;
  for i := 1 to Buf.Size do
  begin
    Buf.Read(B, 1);
    Result[(i * 2) - 1] := Convert[B shr $4];
    Result[(i * 2)] := Convert[B and $F];
  end;
  Buf.Position := p;
end;

procedure TmStream.LoadFromHexStr(const Hex: string);
const
  Convert: array ['0' .. 'f'] of SmallInt = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13,
    14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10,
    11, 12, 13, 14, 15);
var
  i, p: integer;
  B: byte;
  Buf: TStream;
begin
  Buf := Self;
  if Buf.Size < Length(Hex) div 2 then
    Buf.Size := Length(Hex) div 2;
  p := Buf.Position;
  Buf.Position := 0;
  i := 1;
  while i <= Length(Hex) do
  begin
    if not(Hex[i] in ['0' .. 'f']) or not(Hex[i + 1] in ['0' .. 'f']) then
      Break;
    B := byte((Convert[Hex[i]] shl 4) + Convert[Hex[i + 1]]);
    Buf.Write(B, 1);
    Inc(i, 2);
  end;
  Buf.Position := p;
end;

end.
Ответить с цитированием
  #7  
Старый 07.03.2013, 11:57
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Надеюсь переводить "головку" стрима в нулевую позицию перед loadfromstream не забываешь?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 07.03.2013, 13:56
Аватар для darktmlr
darktmlr darktmlr вне форума
Прохожий
 
Регистрация: 12.07.2010
Адрес: Северодвинск
Сообщения: 19
Версия Delphi: 7, 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Надеюсь переводить "головку" стрима в нулевую позицию перед loadfromstream не забываешь?

Я так понимаю что так и делается

Код:
begin
  Clear;
  if Length(AText) = 0 then
    Exit;
  SetSize(Length(AText) div 2);
  HexToBin(PWideChar(AText), PAnsiChar(Self.Memory), Length(AText) div 2);
  Position := 0; {<<<<<<<}
end;

получается записать прочитать все это только очень маленькую картинку (пробовала 3х3 bmp)...
Хоть бы ктонибудь каккойнибудь пример оставил. на словах можно бесконечно рассуждать

Последний раз редактировалось darktmlr, 07.03.2013 в 14:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter