照片仅以.jpg而不是.png格式保存到datasnap

时间:2019-02-25 21:51:27

标签: delphi

我正在使用Datasnap通过以下代码将照片编码为base64将照片发送到服务器:

我的应用代码

将图像转换为base64并以Json格式发送到服务器。

Memoria := TMemoryStream.Create;
Imagem.Picture.Bitmap.SaveToStream(Memoria);
Memoria.Position := 0;
StrEnv := TStringStream.Create;
TNetEncoding.Base64.Encode(Memoria, StrEnv);
StrEnv.Position := 0;
JOImagem := TJSONObject.Create;
JOImagem.AddPair('photo', StrEnv.DataString);

Datasnap服务器

获取base64图像并将其另存为jpg图像。

lInStream := TStringStream.Create(JsonObj.GetValue('photo').Value);
lInStream.Position := 0;
lOutStream := TMemoryStream.Create;
TNetEncoding.Base64.Decode(lInStream, lOutStream);
lOutStream.Position := 0;
lOutStream.SaveToFile('photo-name' + '.jpg');

案例1。

如果我直接从网络摄像头拍摄照片,则图像保存成功。

案例2。

如果我从计算机上拍摄了.png或.jpg照片(使用OpenPictureDialog)并保存了。它已保存,但是当我打开时说:

我们不支持这种文件格式。

问题

仅当我使用网络摄像头拍照时,它才有效;如果从计算机上获取照片,则不起作用。

1 个答案:

答案 0 :(得分:1)

访问mysqli_set_charset($bdd, "utf8"); 属性将强制图片保留BMP图像(清除当前所有非BMP图像)。这是documented behavior

  

使用TImage.Picture.Bitmap引用图片对象包含位图时。如果图片包含图元文件或图标图形时引用了Bitmap,则该图形将不会转换(Types of Graphic Objects)。相反,图片的原始内容将被丢弃,Bitmap返回一个新的空白位图。

这样,调用Bitmap将永远不会保存为BMP以外的任何格式。

如果将BMP以外的其他任何格式加载到Bitmap.SaveToStream()中,并且想要在访问和保存图像时保留该格式,则需要使用Picture属性而不是{{1 }}属性,例如:

Picture.Graphic