TIdDecoderMIME работает просто отлично. Пробовал и проверял. Просто посмотрите на примеры кода, предоставленные Indy.
Также OmniXML имеет модуль OmniXMLUtils.pas с различными служебными функциями для XML.
Внутри вы можете найти автономную функцию кодирования / декодирования Base64. Вы можете скопировать их вставить или использовать их как есть.
В противном случае отправьте код, используя TIdDecoderMIME. Это должно быть ошибка в вашем коде.
EDIT:
Вы должны следить за тем, чтобы вы записали строку в поток в виде однобайтового порядка. Base64 работает с байтами (символы ASCII) и не будет работать правильно, если вы укажете 2-байтовую строку Unicode. Если вы возьмете в качестве строки последовательность в кодировке Base64 и запишете ее в поток, как есть, у вас будет ошибка, потому что длина такого потока будет вдвое больше, чем оригинал.
Вы можете использовать TStringStream или использовать AnsiStrings для этой задачи. Пока вы придерживаетесь этого, кодирование / декодирование будет работать правильно.
Вы также можете использовать мой SimpleStorage , который сделает всю работу за вас. Чтение изображения из XML сводится к такой простой задаче, как:
Jpeg := TJPEGImage.Create;
try
Jpeg.LoadFromStream(SrcStorage.Get('Image').Filter('gzip').AsBinary.Stream);
finally
Jpeg.Free;
end;
Легко, не правда ли (и это также распаковывается в процессе). :)