Delphi 如何在TWebBrowser或TImage中加载base64加密url?

Delphi 如何在TWebBrowser或TImage中加载base64加密url?,delphi,base64,twebbrowser,delphi-10.3-rio,timage,Delphi,Base64,Twebbrowser,Delphi 10.3 Rio,Timage,我已经在base64中加密,这是一个动画QRCode 如何在TWebBrowser(或TImage)中加载它?提前谢谢 编辑: 这是我的尝试,但没有成功: uses IdHTTP, IdSSLOpenSSL, GIFImg, ClipBrd; type TForm1 = class(TForm) Button1: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); proce

我已经在base64中加密,这是一个动画QRCode

如何在
TWebBrowser
(或
TImage
)中加载它?提前谢谢


编辑:

这是我的尝试,但没有成功:

uses
 IdHTTP, IdSSLOpenSSL, GIFImg, ClipBrd;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetStrFromClipbrd: string;
begin
  if Clipboard.HasFormat(CF_TEXT) then
    Result := Clipboard.AsText
  else
  begin
    ShowMessage('There is no text in the Clipboard!');
    Result := '';
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
  IdHTTP1: TIdHTTP;
  GIF: TGIFImage;
begin
  MS := TMemoryStream.Create;
  try
    IdHTTP1 := TIdHTTP.Create;
    try
      GIF := TGIFImage.Create;
      try
        IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
        IdHTTP1.HandleRedirects := True;
        IdHTTP1.Get(GetStrFromClipbrd, MS);
        MS.Seek(0, soFromBeginning);
        GIF.LoadFromStream(MS);
        Image1.Picture.Assign(GIF);
        (Image1.Picture.Graphic as TGIFImage).Animate := True;
        //(Image1.Picture.Graphic as TGIFImage).AnimationSpeed := 500;
      finally
        FreeAndNil(GIF);
      end;
    finally
      FreeAndNil(IdHTTP1);
    end;
  finally
    FreeAndNil(MS);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DoubleBuffered := True;
end;

end.

数据:
不是可以使用
TIdHTTP
(或任何其他HTTP库)请求的URL类型,也不需要,因为所有数据都直接在URL本身中编码。因此,只需提取base64部分并使用您选择的任何base64解码器对其进行解码

由于您的代码已经在使用Indy,您可以使用
IdCoderMIME
单元中的
TidDecoderMie
类将base64数据解码为二进制流,例如使用
TidDecoderMie.DecodeStream()
类过程。然后可以将该流加载到相应的
TGraphic
子体(
tgiImage
TBitmap
,等等),最后可以将该图形加载到
TImage

例如:

使用
IdGlobal、IdGlobalProtocols、IdCoderMIME、IdHTTP、IdSSLOpenSSL、,
图形、GIFImg、JPEG、ClipBrd;
函数GetStrFromClipbrd:string;
常数
CTextFormat={$IFDEF UNICODE}CF_UNICODETEXT{$ELSE}CF_TEXT{$ENDIF};
开始
如果是Clipboard.HasFormat(CTextFormat),则
结果:=Clipboard.AsText
其他的
结果:='';
终止
程序TForm1.按钮1单击(发送方:TObject);
变量
图形:TGraphic;
MS:TMemoryStream;
IdHTTP1:TIdHTTP;
URL,ContentType:string;
开始
URL:=GetStrFromClipbrd;
如果URL='',则
开始
ShowMessage('剪贴板中没有文本!');
出口
终止
图形:=零;
尝试
MS:=TMemoryStream.Create;
尝试
如果TextStartsWith(URL,'数据:'),则
开始
获取(URL“:”);
ContentType:=获取(URL,,);
如果不是TextEndsWith(ContentType,”;base64'),则
开始
ShowMessage('数据未在base64中编码!');
出口
终止
SetLength(ContentType),Length(ContentType)-7;
decoderMime.DecodeStream(URL,MS);
如果ContentType='',则
ContentType:='文本/纯文本;字符集=US-ASCII';
结束其他
开始
IdHTTP1:=TIdHTTP.Create;
尝试
IdHTTP1.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
IdHTTP1.HandlerRedirects:=True;
IdHTTP1.Get(URL,MS);
ContentType:=IdHTTP1.Response.ContentType;
最后
IdHTTP1.免费;
终止
终止
女士职位:=0;
case posinstrary(ExtractHeaderItem(ContentType),
['image/gif','image/jpeg','image/bmp'{,…}],
错误)的
0:Graphic:=TGIFImage.Create;
1:图形:=TJPEGImage.Create;
2:图形:=TBitmap.Create;
// ...
其他的
ShowMessage('不支持的图像类型!');
出口
终止
{您提供的'data:'URL格式不正确,表示图像类型不正确
是“image/bmp”,即使它实际上是GIF,因此应该
说“image/gif”。以避免上述代码出现问题
在这种情况下使用错误的TGraphic类,您可以查看
在解码数据的前几个字节确定其实际值
图像类型,例如。。。
常数
签名:字节=($47,$49,$46,$38,$37,$61)的数组[0..5];
签名:字节=($47,$49,$46,$38,$39,$61)的数组[0..5];
签名:字节=($FF,$D8,$FF)的数组[0..2];
签名:字节=($42,$4D)的数组[0..1];
...
如果(MS.Size>=6)和
(CompareMem(MS.Memory,@Signature_GIF87a,6)或
CompareMem(MS.Memory,@Signature_-GIF89a,6))然后
开始
图形:=TGIFImage.Create;
终止
如果(MS.Size>=3)和
CompareMem(MS.Memory,@Signature\u JPEG,3)然后
开始
图形:=TJPEGImage.Create;
终止
如果(MS.Size>=2)和
CompareMem(MS.Memory,@Signature\u BMP,2)然后
开始
图形:=TBitmap.Create;
终止
...
其他的
ShowMessage('不支持的图像类型!');
出口
终止
}
图形。LoadFromStream(毫秒);
最后
弗里女士;
终止
图1.图片.分配(图形);
最后
图形。免费;
终止
如果Image.Picture.Graphic是TGIFImage,则
开始
tgiImage(Image.Picture.Graphic).Animate:=True;
//tgiImage(Image.Picture.Graphic).AnimationSpeed:=500;
终止
终止

这不是用Delphi base64函数加密的,我也可以用它来解密代码。base64是编码数据的标准方法,而不是加密数据。任何正确实现的Base64解码器都应该能够解码数据。看,我想,首先是T编码…@RobLambden,非常感谢<代码>系统。网络编码工作正常。PS:已测试以GIF图像的形式保存到磁盘。@RemyLebeau,谢谢,+1 by:
“数据:不是您可以使用TIdHTTP请求的URL类型,您也不需要这样做。所有图像数据都直接在URL字符串本身中编码。”
。但是编码的url是一个动画图像,那么我想那是一个GIF,而不是你建议的BMP。@BrowJr你显示的
数据:
url是
图像/BMP
,而不是
图像/GIF
,即使它实际上包含一个GIF图像。无论你从哪里获得URL,它都是错误的。