• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

delphi将图片转换成Base64编码函数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
{**************************************************************************
  名称:   BaseImage
  参数:   fn: TFilename
  返回值: string
  功能:   将fn文件转换成Base64编码,返回值为编码
 **************************************************************************}
uses EncdDecd; function BaseImage(fn: string): string; var m1: TMemoryStream; m2: TStringStream; str: string; begin m1 := TMemoryStream.Create; m2 := TStringStream.Create; m1.LoadFromFile(fn); EncdDecd.EncodeStream(m1, m2); // 将m1的内容Base64到m2中 str := m2.DataString; str := StringReplace(str, #13, '', [rfReplaceAll]); // 这里m2中数据会自动添加回车换行,所以需要将回车换行替换成空字符 str := StringReplace(str, #10, '', [rfReplaceAll]); result := str; // 返回值为Base64的Stream m1.Free; m2.Free; end;

 转成base64后,MemoryStream比原图的流小,便于上传。

//先压缩图片,再将压缩的图片转换成base64
var m1: TMemoryStream; // base64的图片 m2: TStringStream; // 压缩之后的图片 jpg: TJpegImage; // jpg原图 bmp: TBitmap; // bmp压缩转换 begin jpg := TJpegImage.Create; bmp := TBitmap.Create; m1 := TMemoryStream.Create; m2 := TStringStream.Create; jpg.LoadFromFile('d:/test.jpg'); bmp.Width := jpg.Width div 2; bmp.Height := jpg.Height div 2; bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpg); jpg.Assign(bmp); jpg.Compress; jpg.CompressionQuality := 70; jpg.SaveToStream(m1); m1.Position := 0; // 一定要还原指针,才能base64 EncdDecd.EncodeStream(m1, m2); memo1.Lines.Add(m2.DataString.Replace(#13, '').Replace(#10, '')); m2.SaveToFile('d:/base64.txt'); m1.SaveToFile('d:/base64-01.txt'); bmp.Free; jpg.Free; m1.Free; m2.Free; end;

 这里我出了一个错误,就是在压缩图片后,直接加载到base64后,m2中没有内容,

但把m1.clear后,再加载是有内容的,刚开始我也不知道,很奇怪的问题,

但后来问了大神,说要m1.position := 0;置为0后,才能加载。

原因在于转换成base64时,m1指针在最后一位,但转换时又是从指针开始,

所以指针后面会没内容。(又进一步的理解指针了)

 

procedure Base64Put(Base64Str,FileName:String);//base64字符串保存为文件  // 解码
var
  m:TMemoryStream;
  b:TBytes;
begin
  b:=DecodeBase64(Base64Str);
  m:=TMemoryStream.Create;
  m.Write(b,length(b));
  m.SaveToFile(FileName);
  FreeAndNil(m);
end;

function  Base64Get(FileName:String):String;//读出文件内容为base64字符串   // 转码
var
  m:TMemoryStream;
  s:TStringStream;
begin
  result:='';
  if(FileExists(FileName)) then begin
    m:=TMemoryStream.Create;
    s:=TStringStream.Create;
    m.LoadFromFile(FileName);
    encddecd.EncodeStream(m,s);
    result:=s.DataString;
    FreeAndNil(m);
    FreeAndNil(s);
  end;
end;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
DelphiTFileStream打开模式与共享模式发布时间:2022-07-18
下一篇:
DelphiXE5Android运行黑屏卡死的解决方法发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap