Delphi6でBase64

 
Delphi6の Unit 

プログラミングの話。

今回受託した案件は XMLファイルから車両のデータを取り出し、更に Base64でエンコードされた JPEG画像をファイルへ保存するというもの。

最新の RAD環境だと情報があって割と簡単に実装できたのですが、単純な機能なのに実行ファイルが大きい。なので、どうにかして Delphi6で作ろうと試行錯誤していました。海外の BBSまで検索しないと情報が得られなかったのですが、なんとかものにできました。結果、2.8MBだった実行ファイルが 750KBまで小さくできました。

きっと同様な事で困っている人もいると思うしなかなか苦労したので、実装方法をシェアします。

前提として XMLファイルへ埋め込まれている画像は JPEGで、タグで囲まれているものとします。関数の全文を載せますので、適宜編集してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function AnkXmlDecodeJpeg(XmlFile: string): Boolean;
var
  sl: TStringList;
  s, sJpg: AnsiString;
  ms : TMemoryStream;
  jpg : TJpegImage;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(XmlFile);
    s := sl.Text;
 
    sJpg := AnkXmlValue(s, '<img>');
 
    ms := TMemoryStream.Create;
    try
      if Length(sJpg)>0 then
      begin
        // dc := TIdDecoderMIME.Create(nil);
        dc.DecodeStream(sJpg, ms);
        ms.position:=0;
 
        jpg:=TJpegImage.Create;
        try
          jpg.LoadFromStream(ms);
          jpg.SaveToFile(ChangeFileExt(XmlFile, '.jpg'));
          Result := true;
        finally
          // FreeAndNil(dc);
          FreeAndNil(jpg);
        end;
      end;
    finally
      FreeAndNil(ms);
    end;
  finally
    FreeAndNil(sl);
  end;
end;