为什么上传的照片比保存的照片小得多-Delphi 10.3.2,Firemonkey

我有Delphi 10.3.2 我不了解这种情况:

1) 上传约100万张照片

image1.Bitmap.LoadFromFile('test.jpg');

然后我保存同一张照片

image1.Bitmap.SaveToFile('test_new.jpg');

和test_new.jpg约为3M。为什么???

2)

我想使用IdHTTP和POST请求从TImage(test1.jpg-1MB)对象发送照片到服务器。 我使用功能Base64_Encoding_stream对图像进行编码。 对该函数进行编码后,图像大小(字符串)为20 MB! ?为什么原始文件有1MB?

function Base64_Encoding_stream(_image:Timage): string;
var
  base64: TIdEncoderMIME;
  output: string;
  stream_image : TStream;
begin
    try
      begin
        base64 := TIdEncoderMIME.Create(nil);
        stream_image := TMemoryStream.Create;
        _image.Bitmap.SaveToStream(stream_image);
        stream_image.Position := 0;
        output := TIdEncoderMIME.EncodeStream(stream_image);
        stream_image.Free;
        base64.Free;
        if not(output = '') then
        begin
          Result := output;
        end
        else
        begin
          Result := 'Error';
        end;
      end;
    except
      begin
        Result := 'Error'
      end;
    end;
 end;


....

img_encoded := Base64_Encoding_stream(Image1);

.....

procedure Send(_json:String );
var
  lHTTP             : TIdHTTP;
  PostData          : TStringList;
begin
  PostData := TStringList.Create;
  lHTTP := TIdHTTP.Create(nil);
  try
      PostData.Add('dane='  + _json );
      lHTTP.Request.UserAgent   :=   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
      lHTTP.Request.Connection  := 'keep-alive';
      lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
      lHTTP.Request.Charset     := 'utf-8';
      lHTTP.Request.Method      := 'POST';

    _dane := lHTTP.Post('http://......./add_photo.php',PostData);

  finally
    lHTTP.Free;
    PostData.Free;
end;


kxp1125 回答:为什么上传的照片比保存的照片小得多-Delphi 10.3.2,Firemonkey

要使用base64发布原始文件,您基本上可以使用自己的代码。您只需要像下面这样在base64编码例程中更改已使用的流:

function Base64_Encoding_stream(const filename: string): string;
var
  stream_image : TStream;
begin
  try
    // create read-only stream to access the file data
    stream_image := TFileStream.Create(filename,fmOpenRead or fmShareDenyWrite);
    // the stream position will be ‘0’,so no need to set that
    Try
      Result := TIdEncoderMIME.EncodeStream(stream_image);
    Finally
      stream_image.Free;
    End;
    if length(result) = 0 then
    begin
      Result := 'Error';
    end;
  except
    Result := 'Error'
  end;
end;

此外,我还通过一些try / finally部分重构了您的代码,以确保在发生错误时不会发生内存泄漏。并且我删除了try / except中的开始/结束,因为不需要这些。

还删除了本地字符串变量,以避免双重字符串分配和TIdEncoderMIME base64对象的不必要构造。

本文链接:https://www.f2er.com/2975342.html

大家都在问