|
#1
|
||||
|
||||
XML + картинка
Подскажите пожалуйстя кто знает. нужно наряду с разными параметрами сохранить картинку в XML. Искала информацию и ничего конкретного не нашла.
Пишут только что можно с помощью потока преобразовав его в строку, но в этом случае действуют ограничения размера типа String, а картинку нужно хранить большую ~300кб. Тут же пишут что с помошью компанентов Indy нужно преобразовать String в String base64. |
#2
|
|||
|
|||
Тип String может быть длинной до 2Гб (теоретически). Лично я больше чем 2 Мб не делал. Такую строку можно в xml хранить в CDATA (http://www.w3schools.com/xml/xml_cdata.asp)
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
darktmlr (07.03.2013)
|
#3
|
||||
|
||||
Работаю с Delphi 2010. И на сколько я понимаю там явное ограничение на String. В Timage метод SaveToStream... чем еще воспользоваться не знаю. И вот как взять картинку из компонента и записать с помощью TXMLFile... с помощью потока или чего-то еще...
|
#4
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
darktmlr (07.03.2013)
|
#5
|
||||
|
||||
В nativeXML картинка в base64 кодируется, причем он делает все сам, только картинку передавай нужную.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
||||
|
||||
Цитата:
как передавать можно пример? Нашла в интернете методы для класса 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
|
||||
|
||||
Надеюсь переводить "головку" стрима в нулевую позицию перед loadfromstream не забываешь?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#8
|
||||
|
||||
Цитата:
Я так понимаю что так и делается Код:
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. |