{**************************************************************************
名稱: 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;
