WPF Не удается получить изображение WebP из URL? - PullRequest
0 голосов
/ 15 марта 2019

Я не могу получить изображение из URL.Ранее я вообще не мог подключиться к сайту, пока не установил заголовки HttpClient.Я могу получать изображения из других источников, но не из этого конкретного.

Код для получения изображения:

var img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri("https://i1.adis.ws/i/jpl/jd_083285_a?qlt=80&w=600&h=425&v=1&fmt=webp", UriKind.RelativeOrAbsolute);
        img.EndInit();
        Console.Out.WriteLine();
        ImageShoe.Source = img;

Если я пытаюсь получить другое изображение, используя другой URL, дляпример https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png работает нормально.

Обновление:

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

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        var url = "https://i1.adis.ws/i/jpl/jd_083285_a?qlt=80&w=600&h=425&v=1&fmt=webp";//baseUrl + productUrl;
        var result = await client.GetByteArrayAsync(new Uri(
        MemoryStream buf = new MemoryStream(result);
        var image = new BitmapImage();
        image.StreamSource = buf;
        this.ImageShoe.Source = image;

1 Ответ

3 голосов
/ 16 марта 2019

WPF не поддерживает формат изображения WebP .

Вы можете просто запросить поддерживаемый формат, например PNG, используя fmt=png вместо fmt=webp в URL-адресе запроса:

ImageShoe.Source = new BitmapImage(
    new Uri("https://i1.adis.ws/i/jpl/jd_083285_a?qlt=80&w=600&h=425&v=1&fmt=png"));

Если вам действительно нужна поддержка WebP, следующие методы загружают образ WebP и сначала преобразуют его в System.Drawing.Bitmap с помощью оболочки libwebp для библиотеки .NET .,Затем выполняется второе преобразование из System.Drawing.Bitmap в BitmapImage:

. Библиотека-обертка доступна через NuGet, но вам также необходимо загрузить обернутую библиотеку libwebp для нужной платформы, т.е. x86 или x64,как объяснено на домашней странице библиотеки оболочки.

private async Task<BitmapImage> LoadWebP(string url)
{
    var httpClient = new HttpClient();
    var buffer = await httpClient.GetByteArrayAsync(url);
    var decoder = new Imazen.WebP.SimpleDecoder();
    var bitmap = decoder.DecodeFromBytes(buffer, buffer.Length);
    var bitmapImage = new BitmapImage();

    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
        stream.Position = 0;

        bitmapImage.BeginInit();
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.StreamSource = stream;
        bitmapImage.EndInit();
    }

    return bitmapImage;
}

Я проверил это с

ImageShoe.Source = await LoadWebP(
    "https://i1.adis.ws/i/jpl/jd_083285_a?qlt=80&w=600&h=425&v=1&fmt=webp");
...