Domanda

I'm downloading in image from web to save it locally. It works great with any other image formats but it this method below fails with an argument exception when I try to read a WebP image.

    private static Image GetImage(string url)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return Image.FromStream(response.GetResponseStream());
        }
        catch
        {
            return null;
        }
    }

How do you read .webp images in C#? I found this other question that allows for converting between types but I do not want to do that WebP library for C#

Reason I'm not wanting to do it is because I think it might lose some quality. Besides, I want to know why is this not working.

È stato utile?

Soluzione

The base class libraries won't help you to deal with WebP images. However, if you only want to save the received file to the disk, you don't have to even know that you are dealing with a WebP images. You can simply treat the received data as a binary blob and dump it to a file, for example using Stream.CopyTo and a FileStream.

The Content-Type HTTP header will give you the mime type of the file you're downloading, and the Content-Disposition header can provide you with a filename and extension (though you might have to do some parsing). You can access those using HttpWebResponse.ContentType and HttpWebResponse.Headers["Content-Disposition"].

Altri suggerimenti

@Trillian nailed it. Here is a code snippet for what I did based on his suggestion. Wanted to add code so not posting this as a comment.

To get just the image file extension, you can do this

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();    
string fileExt = response.ContentType.Replace("image/", string.Empty);            

To get the file name with extension, you can do the following and the do parsing like I did above. It just has some more data in it.

response.Headers["Content-Disposition"];

Once you have you file name you want to save as, create a file stream and copy the response stream into it.

FileStream fs = new FileStream(targetPath + fileName, FileMode.Create);
response.GetResponseStream().CopyTo(fs);

Assuming you app has access to the destination, image should get saved. Make sure to add try catch and handle exceptions properly. Also note that FileMode.Create will overwrite if the file already exists!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top