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


本文整理自网络,侵删。

 

{

**************************************************************************

  名称:   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;

相关阅读 >>

Delphi xe2读取内存偏移数据代码

Delphi scrollbox1滚动框鼠标滚轮

Delphi2010中tresourcestream流使用

Delphi 获取文件crc和md5

Delphi内嵌汇编实现�载任意进程的某个dll

Delphi 批量操作按钮组件属性

Delphi tidhttp+tidssliohandlersocket+ssl

Delphi定时器相关的简单例子

Delphi sysutils.comparestr、sysutils.comparetext - 字符串比较

Delphi 通过api强制tedit仅接受数字输入

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...