我正在开发一个Xamarin.Forms PCL应用程序,用户可以在其中选择照片并上传。我想将所选照片发送到网络服务,以便检查格式和文件大小是否正确,然后上传到谷歌照片。
要将其传输到我的网络服务,它需要是一个字符串。我尝试使用
MediaFile file;
var stream = file.GetStream();
var bytes = new byte[stream.Length];
await stream.ReadAsync(bytes, 0, (int)stream.Length);
string content = System.Convert.ToBase64String(bytes);
我的第一个问题是我不知道要将文件初始化为什么,以便正确转换。用户选择图像后,将其存储在具有ImageSource image_source;
一旦上传,它就会到达我的PHP网站,然后我会用$image = $_POST['image_string'];
我的第二个问题是如何将其转换回图像以检查文件类型和图像大小?
使用
将其发送到网站var values = new Dictionary<string, string>
{
{"session", UserData.session },
{"image", ImageAsBase64().Result.Length.ToString() }
};
var content = new FormUrlEncodedContent(values);
var response = await App.client.PostAsync(WebUtils.URL, content);
var responseString = await response.Content.ReadAsStringAsync();
string page_result = responseString;
答案 0 :(得分:1)
您可以使用PHP的GD图像库基本上完成您想要的任何图像。
要从字符串中获取图像,请使用以下命令:
$sourceImg = imagecreatefromstring(file_get_contents($file));
然后保存图像:
imagejpeg($sourceImg, $targetPath, 60); //60 is a compression
以下是一些链接:
imagecreatefromstring():
http://php.net/manual/en/book.image.php
GD图书馆: {{3}}
答案 1 :(得分:1)
将图像上传到服务器是没有意义的,而不是检查它的大小。除非您要压缩它并减小服务器上的大小。
以下是检查图像大小的方法:
var ImageStream = file.GetStream();
var bytes = new byte[ImageStream.Length];
//check if image is too big
double ImageSizeInMB = ((double)(bytes.Length) / (1024 * 1024));
//check if image size is bigger than 5 MB
if(ImageSizeInMB > 5)
{
await DisplayAlert("Error", "Image is too big,reduce resolution and try again", "OK");
return;
}
之后,您需要让用户重新拍摄照片,或者您可以开始压缩它并调整其大小。拍摄后我无法压缩图像,但我确信这是可能的,因为你可以在使用媒体插件选项拍摄图像之前完成。
现在将图像转换为base64:
await ImageStream.ReadAsync(bytes, 0, (int)ImageStream.Length);
string base64 = System.Convert.ToBase64String(bytes);
就是这样,您现在有了相机拍摄的图像并转换为Base64字符串。