Преобразование входного потока в изображение

Я пытаюсь преобразовать входной поток в изображение

Я попытался использовать приведенный ниже код.

var img = Image.FromStream(imagePathErrorMessage.StreamObject);

Мне нужно передать img в представление mvc

 @foreach (var img in imageSet)
                                    {
                                        <div class="thumbnail thumbnail-inline">
                                            <label class="checkbox-inline">
                                                <input type="checkbox" onchange="DisplayedImageOnchange(this)" value="@img.Id" />
                                                <img src="@img.Url" class="img-thumbnail" />
                                            </label>
                                            <div class="btn-block">
                                                <input type="file" class="replace file-loading" />
                                                <button class="btn btn-xs btn-danger delete">delete</button>
                                            </div>
                                        </div>
                                    }

 public JsonResult Upload(object model)
        { 
            var img = Image.FromStream(imagePathErrorMessage.StreamObject);

            return Json(new AdCreative { Id = 100, Url = Url.Content("data:image;base64,@System.Convert.ToBase64String('" + img + "')") }, JsonRequestBehavior.AllowGet);
        }

выдает следующую ошибку:

введите здесь описание изображения

вышеприведенный входной поток из ответа amazon s3.

введите здесь описание изображения


person Kapil    schedule 21.07.2016    source источник


Ответы (1)


Во-первых, вы можете найти дополнительную информацию, нажав «Просмотреть подробности» в окне исключений и развернув любые InnerException свойства.

Вы проверили, что imagePathErrorMessage.StreamObject не является нулевым и предоставляет изображение в одном из принятых форматов?

Это JPG, BMP, TIF, GIF и PNG. Если ваше изображение содержит данные о прозрачности, вы должны сначала преобразовать его в PNG. Вы не можете использовать данные RAW, для этого, я думаю, вам нужно BitmapImage вместо Image

Если поток действителен, он также должен быть в позиции 0, прежде чем вы начнете чтение, например:

imagePathErrorMessage.StreamObject.Position = 0;
var img = Image.FromStream(imagePathErrorMessage.StreamObject);

Редактировать для OP Редактировать:

Вам нужно установить ResponseStream обратно в нулевое положение после его преобразования, но до его копирования в destination?

(если в точке останова, показанной на скриншоте, вы наведете курсор на destination, покажет ли он поток длиной 61153 и CurrentPosition 0?)

Второе редактирование:

Это сообщение с ответом Загрузка изображения из потока без сохранение потока открытым объясняет, почему при использовании Image.FromStream поток должен оставаться открытым в течение всего времени жизни изображения.

person paul    schedule 21.07.2016
comment
да, я установил StreamObject.Position = 0 перед копированием. - person Kapil; 21.07.2016
comment
Ну, если вы сертифицировали в точке Image.FromStream(imagePathErrorMessage.StreamObject);, что ваш объект потока действителен, с ненулевой длиной и в нулевой позиции, то единственное, что я могу предложить, это то, что данные в этом потоке не могут быть преобразованы в один из поддерживаемые типы изображений. - person paul; 21.07.2016
comment
Последнее предложение: кажется, что объект потока должен оставаться открытым в течение всего времени существования Image. - person paul; 21.07.2016