【问题标题】:Image To String Delphi XE7 Android and Ios图像到字符串 Delphi XE7 Android 和 Ios
【发布时间】:2015-03-27 09:19:35
【问题描述】:

我在 Delphi Xe7 FireMonkey 使用 WebServices 编写移动应用程序。 我有一个关于网络服务的网络方法。该网络方法是将 Base64 字符串发布到我的数据库中。 Delphi Side 是从 Bitmap 创建这个 Base64 字符串。 我用这个算法

Uses ....EncdDecd;
function Tfrm_yenikayit.BitmapToBase64(Bitmap: TBitmap): string;
var
  Input : TMemoryStream;
  Output: TStringStream;
begin
  Input := TMemoryStream.Create;
  try
    Bitmap.SaveToStream(Input);
    Input.Position := 0;
    Output := TStringStream.Create('');
    try
      EncdDecd.EncodeStream(Input, Output);
      Result := Output.DataString;
    finally
      Output.Free;
    end;
  finally
    Input.Free;
  end;
end;

但是尺寸为 1920x1280 的照片会产生大约 300 万个字符。 我如何将图像制作成短字符串并且比这个算法更快?

【问题讨论】:

  • 1920x1280 位图包含 300 万像素,占用(对于 24 位格式)900 万字节,Base64 编码给出的结果大小约为 12 兆字节。为了使其更短,您可以例如将位图压缩为 jpeg(有质量损失)
  • 对不起,我想写一个比这个 Base64String 更短的字符串
  • @Mbo 我知道,但质量对我来说并不重要,只是我想拍照
  • OK,然后创建JPEG,为其分配位图,并将jpeg保存到流中进行base64编码
  • @MBo 我想,但 firemonkey 上没有 Tjpegimage,我尝试用这个算法制作相同大小的图片。结果是一样的

标签: android delphi base64 delphi-xe7


【解决方案1】:

我找到了算法的解决方案

Function BitmapToBase64(Bitmap:Tbitmap):string;
var
  BS: TBitmapSurface;
  AStream: TMemoryStream;
  AStringStream : TStringStream;
  AResult : AnsiString;
begin
  BS := TBitmapSurface.Create;
  BS.Assign(Bitmap);
  BS.SetSize(600,400);///Solution this
  AStream := TMemoryStream.Create;
  try
    TBitmapCodecManager.SaveToStream(AStream, BS, '.jpg');
    AStringStream := TStringStream.Create(EncodeBase64(AStream, AStream.Size));
    Result:=AStringStream.DataString;     
  finally
    AStream.Free;
    AStringStream.Free;
    BS.Free;
  end;
end;

我找到了解决方案BS.SetSize(600,400),这对我来说并不重要

【讨论】:

  • 我添加了 Result 的初始化。
  • @LURD 我再次删除了它。不需要。
  • System.NetEncoding 用于base64。
  • @DavidHeffernan,这个答案是否不再有效,stackoverflow.com/a/5336885/576719
  • TStringStream 是多余的并且浪费处理(将字符串转换为字节回字符串。此代码:AStringStream := TStringStream.Create(EncodeBase64(AStream, AStream.Size)); Result:=AStringStream.DataString; 实际上与此相同:Result := EncodeBase64(AStream, AStream.Size);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2013-05-16
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多