Возврат изображения в веб-службе

Я разрабатываю базовый веб-сервис. Пользователь отправляет строку base 64, и служба должна возвращать изображение.

У меня есть этот класс:

public class myImage
{    
    public Byte[] Matrix { get; set; }        
    public int Width { get; set; }
    public int Height { get; set; }
}

Матрица представляет собой массив байтов, содержащий значение пикселя в оттенках серого.

Я видел много тем (например, эту или этот) о преобразовании массива байтов в изображение, но у меня это не сработало . Я добавил ссылку на System.Drawing, но у меня есть ошибка:

Не удалось найти имя типа «Изображение» в пространстве имен «System.Drawing». Этот тип был перенаправлен в сборку «System.Drawing.Common, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51». Рассмотрите возможность добавления ссылки на эту сборку.

Я видел, что должен вернуть FileResult, но я не могу создать результат, если не могу использовать System.Drawing.Image:

[HttpPost]
[Route("CreateImage")]
public FileResult PostSealCryptItem([FromBody]String base64)
{
    MyImage myImg = createImg(base64);

    FileResult result = ?;
    return result;
}

Как я могу создать FileResult из моего массива байтов?


person A.Pissicat    schedule 14.01.2019    source источник
comment
Я думаю, это должно быть FileResult   -  person Stefan    schedule 14.01.2019
comment
См.: stackoverflow.com/questions/34853072/   -  person Stefan    schedule 14.01.2019
comment
Возможный дубликат Как вернуть файл из ASP.net 5 веб-API   -  person Stefan    schedule 14.01.2019
comment
При использовании Asp Core File Result работает. Проверьте ответ ниже. Хотя я думаю, что чего-то не хватает. Убедитесь, что base64 отформатирован следующим образом: data:image/png;base64,iVBORw0KGgoAAA ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4 //8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU 5ErkJggg==   -  person Neal    schedule 14.01.2019
comment
Не возвращать System.Drawing.Image. Этот класс используется для управления изображениями. Вы также не можете просто вернуть пиксельную матрицу, вам придется сначала создать фактические байты, которые вы хотите вернуть. Когда у вас есть фактический байтовый буфер или поток, вы можете вернуть их с помощью return File(bytes,...) или return File(stream,...).   -  person Panagiotis Kanavos    schedule 14.01.2019
comment
Что вы пытаетесь сделать в первую очередь? Преобразовать строку Base64 в байтовый буфер легко, вы можете использовать var buffer=Convert.FromBase64String(). Хотя это ничего не говорит о содержании. Если этот контент уже является допустимым изображением, вы можете просто вернуть его с помощью return File(buffer,theactualcontenttype). Вам понадобится способ определить тип изображения или обман и использовать application/octet-stream.   -  person Panagiotis Kanavos    schedule 14.01.2019
comment
Если это не фактическое изображение или если вы хотите преобразовать его в определенный формат, например png или jpg, вам понадобится библиотека, чтобы а) определить тип содержимого и б) преобразовать его в желаемый формат. формат. Я бы предложил использовать для этого ImageSharp вместо System.Drawing.   -  person Panagiotis Kanavos    schedule 14.01.2019
comment
@PanagiotisKanavos Я отредактировал вопрос, чтобы он был более ясным. Если вы просто хотите вернуть изображение (png или jpg), созданное из массива байтов. Мое преобразование из базы 64 в порядке.   -  person A.Pissicat    schedule 14.01.2019


Ответы (1)


Вы можете сделать это следующим образом.

public HttpResponseMessage  PostSealCryptItem([FromBody]String base64)
{
    MyImage myImg = createImg(base64);
    Image img = convertMyImgToImage(myImg);
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(ms.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");

        return result;
    }
}
person Anu Viswan    schedule 14.01.2019