Изображение на base64, а затем загрузить - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над приложением Xamarin.Forms PCL, где пользователи могут выбрать фотографию и загрузить ее.Я хотел бы отправить выбранную фотографию в веб-службу, чтобы ее можно было проверить на правильный формат и размер файла, а затем загрузить в фотографии Google.

Чтобы передать его на мой веб-сервис, это должна быть строка.Я попытался использовать

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;

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Не имеет смысла загружать изображение на сервер, чем проверять его размер.Если только вы не собираетесь сжимать его и уменьшать размер на сервере.

Вот как проверить размер изображения:

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.

0 голосов
/ 26 апреля 2018

Вы можете использовать библиотеку изображений GD в PHP, чтобы делать с изображением все, что вы хотите.

Чтобы получить изображение из строки, используйте это:

 $sourceImg = imagecreatefromstring(file_get_contents($file));

Затем, чтобы сохранить изображение:

 imagejpeg($sourceImg, $targetPath, 60);  //60 is a compression

Вот несколько ссылок:

imagecreatefromstring ():

http://php.net/manual/en/function.imagecreatefromstring.php

Библиотека GD: http://php.net/manual/en/book.image.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...