Как определить, завершен ли Image.FromStream - PullRequest
2 голосов
/ 18 сентября 2011

У меня есть следующий код:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
var response = request.GetResponse();
var stream = response.GetResponseStream();
if (stream != null) {
    Image newImage = Image.FromStream(stream, true);
    pic.Thumb = newImage.ImageToByteArray();
}

Что произойдет, если время чтения истекло?Или соединение прервано во время загрузки?

В документах говорится, что оно выдаст ArgumentException, если это недопустимый формат или значение NULL, но я понятия не имею, будет ли выброшено это исключение, если изображениезагружается только частично.

К сожалению, я не могу полагаться на заголовок ContentLength, чтобы сказать мне правильный размер файла, потому что сервер лежит и выдает большую длину контента, чем файл на самом деле.Поэтому я надеюсь, что Image.FromStream сможет определить, завершено ли изображение.

Кто-нибудь может подсказать здесь?

Примечание. ImageToByteArray - это просто метод расширения, использующий поток памяти для преобразования Image в byte[]

ОБНОВЛЕНИЕ:

Согласно Дарину, затемExternalException выдается при попытке сохранить изображение.Однако мое собственное тестирование, в котором я обрезал файл изображения, показывает, что FromStream фактически выдает исключение ArgumentException, если изображение не соответствует правильному количеству байтов.

1 Ответ

4 голосов
/ 18 сентября 2011

Что произойдет, если время чтения истекло?

Перед вводом условия if будет сгенерировано исключение.

Или соединение прервано?

Перед вводом условия if будет сгенерировано исключение.

, но я не знаю, будет ли оно выброшено, если изображение загружено только частично.

Изображение не может быть частично загружено.GetResponseStream - это метод блокировки, означающий, что вы либо получаете все, либо исключение (или, конечно, в вашем случае вы также можете получить исключение, если вы получаете не изображение, а некоторую HTML-страницу, которая произойдет, когда вы попытаетесьсоздайте экземпляр объекта Image GDI +).

В качестве примечания, чтобы избежать утечки, вы, вероятно, также захотите заключить этот одноразовый ресурс Image в оператор using.

...