delphi将图片转换成Base64编码函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | {************************************************************************** 名称: BaseImage 参数: fn: TFilename 返回值: string 功能: 将fn文件转换成Base64编码,返回值为编码 **************************************************************************} <br> 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比原图的流小,便于上传。
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 | //先压缩图片,再将压缩的图片转换成base64<br>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指针在最后一位,但转换时又是从指针开始,
所以指针后面会没内容。(又进一步的理解指针了)
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 | 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 ; |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!