2011-09-18 4 views
2

у меня есть следующий код:Как сказать, если Image.FromStream завершена

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, если он не является допустимым форматом или является нулевым, но я понятия не имею, будет ли это исключение, если изображение загружено только частично.

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

Может ли кто-нибудь дать вам некоторое представление?

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

UPDATE:

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

ответ

4

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

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

Или соединение прекращается?

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

но я понятия не имею, будет ли это исключение, если изображение частично загружено.

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

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

+0

Право, это имеет смысл. Что произойдет, если сервер просто не отправит полное изображение? (Предположим, у них проблемы с загрузкой и получение тайм-аутов в их бэкэнд, и просто отправить частичное изображение, но в противном случае соединение нормально) –

+0

@Mystere Man, я не понимаю. Вы имеете в виду сервер, отправляющий массив байтов, который является недопустимым изображением, например удаленный ресурс, на котором размещается поврежденное изображение? Если да, тогда вы получите «ArgumentException» при попытке загрузить этот поток в объект Image GDI + (метод «Image.FromStream»). –

+0

Я имею в виду, что я не уверен, что класс изображения обнаружит неполное изображение как недействительное или нет и вызовет исключение ArgumentException. –

Смежные вопросы