WPF无法从URL检索WebP图像?

时间:2019-03-15 20:21:04

标签: c# wpf url web-scraping webp

我无法从网址中检索图像。以前,在设置HttpClient标头之前,我根本无法连接到该站点。我可以从其他来源检索图像,但不能从这个特定来源检索图像。

检索图像的代码:

$

如果我尝试使用其他网址检索其他图片,例如https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png,则效果很好。

更新

似乎使用字节数组是可行的方法,但我仍然不确定这里出了什么问题。

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;

1 个答案:

答案 0 :(得分:3)

WPF不支持WebP image format

您可以通过在请求URL中使用fmt=png而不是fmt=webp来简单地请求支持PNG之类的格式:

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映像,并首先在libwebp wrapper for .NET库的帮助下将其转换为System.Drawing.Bitmap。然后进行第二次转换,从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");