C# 在C语言中设置下载图像的调色板#

C# 在C语言中设置下载图像的调色板#,c#,image,web-crawler,rgb,color-palette,C#,Image,Web Crawler,Rgb,Color Palette,我正试图从我的旧网站上抓取大量图片,因为它很快就会被关闭。所有的图像都是JPEG格式的,实际上都是从网站下载的,但其中一些图像在我的本地(Windows)计算机上以绿粉色显示 我发现所有损坏的图片都没有颜色空间元数据和嵌入的颜色配置文件,但我不确定这是否是问题所在,因为我不熟悉图像处理。我在C#中找不到任何设置来将颜色配置文件设置为RGB或类似的设置。 这是我的代码: private static Image GetImageFromUrl(string url) { H

我正试图从我的旧网站上抓取大量图片,因为它很快就会被关闭。所有的图像都是JPEG格式的,实际上都是从网站下载的,但其中一些图像在我的本地(Windows)计算机上以绿粉色显示

我发现所有损坏的图片都没有颜色空间元数据和嵌入的颜色配置文件,但我不确定这是否是问题所在,因为我不熟悉图像处理。我在C#中找不到任何设置来将颜色配置文件设置为RGB或类似的设置。 这是我的代码:

private static Image GetImageFromUrl(string url)
    {
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        try
        {
            using (HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse())
            {
                using (Stream stream = httpWebReponse.GetResponseStream())
                {
                    return Image.FromStream(stream);
                }
            }
        }
        catch (WebException e)
        {
            return null;
        }
    }

    private static void SaveImage(string folderName, string fileName, Image img)
    {
        if (img == null || folderName == null || folderName.Length == 0)
        {
            return;
        }
        string path = "D:\\Files\\" + folderName;
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        using (img)
        {
            img.Save("D:\\Files\\" + folderName + "\\" + fileName, ImageFormat.Jpeg);
        }
    }

SaveImage(folderName, fileName, GetImageFromUrl(resultUrl));
这是在浏览器(左)中以及使用此程序下载(右)时图片的外观:


谢谢您的帮助。

好的,直接保存文件流而不将其转换为本地计算机上的
图像
对象似乎可以绕过此问题。损坏的调色板仍然存在,但不知何故,Windows图片查看器能够正确显示保存的图像(没有奇怪的颜色重音),Photoshop等也是如此

正如Jason Watkins在评论中所建议的,我的代码现在如下所示:

private static void SaveImageFromUrl(string folderName, string fileName, string url)
    {
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        try
        {
            using (HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse())
            {
                using (Stream stream = httpWebReponse.GetResponseStream())
                {
                    //need to call this method here, since the image stream is not disposed
                    SaveImage(folderName, fileName, stream);
                }
            }
        }
        catch (WebException e)
        {
            Console.WriteLine("Image with URL " + url + " not found." + e.Message);
        }

    }

    private static void SaveImage(string folderName, string fileName, Stream img)
    {
        if (img == null || folderName == null || folderName.Length == 0)
        {
            return;
        }
        string path = "D:\\Files\\" + folderName;
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        using (var fileStream = File.Create("D:\\Files\\" + folderName + "\\" + fileName))
        {
            img.CopyTo(fileStream);
            //close the stream from the calling method
            img.Close();
        }
    }

SaveImageFromUrl(folderName, fileName, resultUrl);

这看起来更像是Photoshop的工作,而不是C#……可能可以在PS中一张一张地手动“修复”图片,但正如我所说的,有很多。我知道C#不用于处理图像,但显然有一个我缺少的参数使一些图片保存不正确。嗯。。。我刚刚注意到您正在将响应流转换为图像并重新保存。原始图像是否还没有JPEG?如果是,您应该能够将流保存到文件中。是的,原始文件也是JPEG。将流直接保存到一个基于的文件中完成了这个技巧。但是,这些图像具有相同的(错误的)调色板设置(但这是预期的),但是普通图像查看器能够正确地查看它们(我不知道如何)。谢谢你,你可以考虑把它作为一个答案,所以我可以接受。重新保存有损压缩图像似乎是一个坏主意无论如何,当你真正想做的是下载它们。