Delphi 如何在TWebBrowser或TImage中加载base64加密url?
我已经在base64中加密,这是一个动画QRCode 如何在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
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,它都是错误的。