【问题标题】:Convert a JPG (png / GIf, etc) as a 64base String:将 JPG(png/GIF 等)转换为 base64 字符串:
【发布时间】:2017-01-13 11:02:13
【问题描述】:

我在 XP SP3 上使用 Delphi 7 和 Indy 9。

我的 HTML 中有多个 <img> 标记。

我想将<img src="filepath" ...> 标签转换为<img src="data:image/jpg;base64,..."> 标签。

作为一个练习,我计划在每张图片上都这样做:

procedure TForm1.Button2Click(Sender: TObject);
VAR
   Str    : AnsiString;
   Stream1, Stream2  : TFileStream;
   Decoder : TIDEncoderMime;

BEGIN
   Stream1 := TFilestream.Create(Curdir + '\solopgang.jpg', fmOpenRead);
   Stream2 := TFilestream.Create('C:\test221.html', fmCreate);
   Try
      Decoder := TIDEncoderMime.Create(NIl);
      Str := decoder.Encode(Stream1^, length(Stream1));
      StrToFile('c:\test221.html',Str);
   Finally
      FreeAndNil(Decoder);
      Stream1.Free;
      Stream2.Free;
  END;
end;

但是,当我在我的TWebBrowser 中显示它时,我只得到图像的外框,我不知道为什么。

标签: delphi


【解决方案1】:

正如 David 在 cmets 中提到的那样,您的代码不会如图所示编译。它应该更像这样:

uses
  ..., Classes, IdCoderMIME;

procedure TForm1.Button2Click(Sender: TObject);
var
  Stream : TFileStream;
  Encoder : TIdEncoderMIME;
begin
  Stream := TFileStream.Create(Curdir + '\solopgang.jpg', fmOpenRead or fmShareDenyWrite);
  try
    Encoder := TIdEncoderMIME.Create(nil);
    try
      StrToFile('c:\test221.html', Encoder.Encode(Stream));
    finally
      Encoder.Free;
    end;
  finally
    Stream.Free;
  end;
end;

如果您升级到 Indy 10,则可以改用它:

uses
  ..., Classes, IdGlobal, IdCoderMIME;

procedure TForm1.Button2Click(Sender: TObject);
var
  Stream1, Stream2 : TStream;
begin
  Stream1 := TIdReadFileExclusiveStream.Create(Curdir + '\solopgang.jpg');
  try
    Stream2 := TIdFileCreateStream.Create('c:\test221.html');
    try
      TIdEncoderMIME.EncodeStream(Stream1, Stream2);
    finally
      Stream2.Free;
    end;
  finally
    Stream1.Free;
  end;
end;

【讨论】:

  • 它像我希望的那样工作。但似乎 JPG 不等于 JPEG;和 JPEG(相机)不等于 JPG(计算机)。在一些 JPG(不是 JPEG)中,我得到一个可变高度的黑色像素,然后是图像的其余部分。如果我自己在机器上创建 JPG 和 JPEG 图像(例如 PAINT、photoshop 等),则图像从第 1 行到最后一行显示正确。只有很少的相机图像显示正确。你知道为什么吗?
  • @KristianSander JPG 和 JPEG 是一回事。 JPG 包含元数据,PC 生成的 JPG 可能具有与相机生成的 JPG 不同的元数据。例如,相机 JPG 可能具有用于描述相机方向的元数据。这可能会影响 JPG 在方向感知查看器中的显示方式。您可能必须删除元数据。有很多库可用于处理 JPG。
  • 感谢您更新我。
  • @Toby 我已经更新了我的示例以包含 uses 子句
  • @Toby 我已经修好了
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2013-01-08
  • 2012-07-08
  • 2012-01-22
相关资源
最近更新 更多