Преобразование изображения HEIC в Jpg и загрузка на сервер в Xamarin iOS - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь преобразовать изображение HEIC в код Jpg из приведенного ниже кода при использовании службы зависимостей и пытаюсь отобразить его с помощью изображения и загрузить в веб-API. Но оба не работают, это правильный способ преобразования HEIC в Jpg? если нет, подскажите, пожалуйста, как этого добиться.

Метод обслуживания зависимостей:

public byte[] GetJpgFromHEIC(string path)
{
        byte[] imageAsBytes = File.ReadAllBytes(path);
        UIImage images = new UIImage(NSData.FromArray(imageAsBytes));
        byte[] bytes = images.AsJPEG().ToArray();
        // Stream imgStream = new MemoryStream(bytes);

        return bytes;
}

В коде Xaml за отображением изображения:

Image image = new Image(){};
byte[] bytes = DependencyService.Get<ICommonHelper>
                      ().GetJpgFromHEIC(fileData.FileName);
image.Source = ImageSource.FromStream(() => new MemoryStream(bytes));

Загрузка кода в веб-API: Пробовал в StreamContent и ByteArrayContent как HttpContent, как показано ниже

   HttpResponseMessage response = null;

    string filename = data.FileName; // here data object is a FileData, picked from using FilePicker.

    byte[] fileBytes = DependencyService.Get<ICommonHelper>().GetJpgFromHEIC(data.FilePath);

            HttpContent fileContent = new ByteArrayContent(fileBytes);

    // Stream fileStream = new MemoryStream(fileBytes);
    // HttpContent fileContent = new StreamContent(fileStream);

    fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name =         
             "file", FileName = data.FileName };
    fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            using (var formData = new MultipartFormDataContent())
            {
                formData.Add(fileContent);
                response = await client.PostAsync(uri, formData);
                if (response.IsSuccessStatusCode)
                {
                    Debug.WriteLine(@" Upload CommentsAttachments SUCCESS>> " + response.Content.ToString());
                }
            }

Пожалуйста, предложите мне, что я делаю не так, и как добиться и возможные пути для этого преобразования и загрузки.

Спасибо,

1 Ответ

0 голосов
/ 09 января 2019

Примерно так работает для пути / файла HEIC (или для любого допустимого формата изображений, поддерживаемого iOS). Я использую образец autumn_1440x960.heic.

using (var image = UIImage.FromFile(path))
using (var jpg = image.AsJPEG(0.5f))
using (var stream = jpg.AsStream())
{
    // do something with your stream, just saving it to the cache directory as an example...

    using (var cache = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomain.All, null, true, out var nsError))
    using (var fileStream = new FileStream(Path.Combine(cache.Path, "cache.jpg"), FileMode.Create, FileAccess.Write))
    {
        stream.CopyTo(fileStream);
        imageView1.Image = UIImage.FromFile(Path.Combine(cache.Path, "cache.jpg"));
    }
}

К вашему сведению: копирование байта [] вокруг очень неэффективно, вы можете просто захотеть передать исходный поток обратно и использовать его для заполнения содержимого формы для публикации, просто заставьте его утилизировать, иначе вы потеряете собственные выделения ...

...