2015-05-18 4 views
0

Я пытаюсь выполнить сканирование большого количества изображений с моего старого веб-сайта, потому что он скоро будет закрыт. Все изображения находятся в формате JPEG, все они фактически загружаются с веб-сайта, но некоторые из них показаны в зелено-розовом акценте на моем локальном компьютере (Windows). Я обнаружил, что ни один из поврежденных изображений не имеет метаданных цветового пространства и встроенного цветового профиля, но я не уверен, что это проблема, поскольку я не знаком с обработкой изображений. Я не мог найти никаких настроек на C#, чтобы установить цветной профиль в RGB или что-то подобное. Это мой код:Настройка цветовой палитры загруженного изображения в C#

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)); 

Это, как фотографии выглядят, как в браузере (слева) и при загрузке с помощью этой программы (справа): http://i60.tinypic.com/1zzt9xs.jpg

Спасибо за вашу помощь. (Вы можете загрузить оригиналы Zipped здесь): https://mega.co.nz/#!fEAXGZAB!iFNqVKmaFfiGbm9ybP0nZf0tKu5qbbYn-br9sYjxhos

+0

Это больше похоже на работу для Photoshop, чем C# ... –

+0

Это может быть возможно вручную «ремонт» фотографии один за другим в PS, но как я уже сказал, есть много из них. Я понимаю, что C# не для манипуляции изображениями, но, видимо, есть параметр, который мне не хватает, что некоторые из фотографий сохраняются некорректно. – Csoky

+0

Хм ... Я только заметил, что вы конвертируете поток ответов в изображение и сохраняете его. Являются ли исходные изображения еще не jpeg? Если это так, вы должны просто сохранить поток в файл. –

ответ

0

ОК, кажется, эта проблема может быть обойдена путем сохранения потока файлов непосредственно, без преобразования его в Image объекта на локальном компьютере. Коррумпированная цветовая палитра остается, но каким-то образом Windows Picture Viewer может отображать сохраненные изображения правильно (не странные цветовые акценты), а также Photoshop и т. Д.

Как было предложено Джейсоном Уоткинсом в комментариях, мой код выглядит следующим образом :

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); 
Смежные вопросы