代码之家  ›  专栏  ›  技术社区  ›  James

Delphi2010-从XML文档解码Base64编码的图像

  •  3
  • James  · 技术社区  · 15 年前

    我试图从我的应用程序中的XML文档中解码base64编码的EMF图像,并将其呈现在屏幕上,然而,它似乎从未出现过。

    Base64 Decode 选项并将文件另存为 .emf 它在油漆中开得很好。所以我认为问题是我如何解码它。

    How to encode / decode Base 64 string
    http://www.swissdelphicenter.ch/torry/showcode.php?id=1223

    我也试过 TIdDecoderMIME

    有人知道从XML解码base64编码字符串的最可靠方法吗?

    例子

    procedure TXmlSerializer.SaveImageFromString(const AValue: string);
    var
      StrStream: TStringStream;
      Decoder: TIdDecoderMIME;
    begin
      // AValue is base64 encoded string from XML doc
      Decoder := TIdDecoderMIME.Create(nil);
      try
        StrStream := TStringStream.Create(Decoder.DecodeString(AValue));
        try
          StrStream.SaveToFile('MyPath\Image.emf');
        finally
          StrStream.Free;
        end;
      finally
        Decoder.Free;
      end;
    end;
    

    为什么上面的方法不起作用,而是将原始数据复制到Notepad++并解码&另存为 电动势 作品?

    3 回复  |  直到 15 年前
        1
  •  7
  •   glob    15 年前

    你用一个字符串来存储二进制数据;德尔福2010的unicode缺陷可能是这里的“罪魁祸首”。

    尝试使用支持解码到流的base64解码器,并直接解码到流 TFileStream ; 我用 JclMime

    作为 JclMime公司 仅支持流对流解码,我在从XML有效负载解码base64数据时使用以下包装器:

    procedure MimeDecode(const inputString: string; const outputStream: Tstream);
    var
      ss: TStringStream;
    begin
      ss := TStringStream.Create(inputString);
      try
        JclMime.MimeDecodeStream(ss, outputStream);
      finally
        ss.free;
      end;
    end;
    
        2
  •  2
  •   Runner    15 年前

    阿尔索 OmniXML 具有OmniXMLUtils.pas单元和各种XML实用程序函数。

    编辑:

    您可以使用TStringStream或使用AnsiStrings执行任务。只要你坚持,编码/解码将正常工作。

    你也可以用我的 SimpleStorage 为你做所有的工作。从XML读取图像需要完成以下简单任务:

      Jpeg := TJPEGImage.Create;
      try
        Jpeg.LoadFromStream(SrcStorage.Get('Image').Filter('gzip').AsBinary.Stream);
      finally
        Jpeg.Free;
      end;
    

    很简单,不是吗(在这个过程中它也会被解压)

        3
  •  0
  •   Marcus Adams    15 年前

    在代码中,确保在读取流之前将其位置设置为0。

    StrStream.Seek(0, soFromBeginning);
    

    我不熟悉TStringStream的SaveToFile()方法。你确定吗?

    另外,由于Delphi2010支持unicode字符串,因此在处理二进制数据时可能需要使用AnsiStrings。将多字节字符类型与单字节数据混合时要小心。