我正在使用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)并保存了。它已保存,但是当我打开时说:
我们不支持这种文件格式。
问题
仅当我使用网络摄像头拍照时,它才有效;如果从计算机上获取照片,则不起作用。
答案 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