Я пытаюсь запустить этот код, но я всегда получаю сообщение об ошибке "не удается получить доступ к закрытому потоку"
private MemoryStream GetBitmap(Stream stream, int width, int height)
{
const int size = 150;
const int quality = 75;
using (var image = new Bitmap(System.Drawing.Image.FromStream(stream)))
{
//int width, height;
if (image.Width > image.Height)
{
width = size;
height = Convert.ToInt32(image.Height * size / (double)image.Width);
}
else
{
width = Convert.ToInt32(image.Width * size / (double)image.Height);
height = size;
}
var resized = new Bitmap(width, height);
using (var graphics = Graphics.FromImage(resized))
{
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(image, 0, 0, width, height);
using (var output = new MemoryStream())
{
var qualityParamId = Encoder.Quality;
var encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality);
var codec = ImageCodecInfo.GetImageDecoders()
.FirstOrDefault(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
resized.Save(output, codec, encoderParameters);
return output;
}
}
}
}
Не уверен, как я могу предотвратить вывод потока Streamstream из потока Stream.
РЕДАКТИРОВАТЬ После ваших предложений вот новый код
public Stream GetBitmap(Stream stream)
{
using (var image = SystemDrawingImage.FromStream(stream))
{
var scaled = ScaledSize(image.Width, image.Height, ThumbnailSize);
var resized = new Bitmap(scaled.width, scaled.height);
using (var graphics = Graphics.FromImage(resized))
using (var attributes = new ImageAttributes())
{
attributes.SetWrapMode(WrapMode.TileFlipXY);
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.AssumeLinear;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(image, Rectangle.FromLTRB(0, 0, resized.Width, resized.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
using (var encoderParams = new EncoderParameters(1))
using (var qualityParam = new EncoderParameter(Encoder.Quality, (long)Quality))
{
encoderParams.Param[0] = qualityParam;
var streamOutput = new MemoryStream();
resized.Save(streamOutput, systemDrawingJpegCodec, encoderParams);
return streamOutput;
}
}
}
}
Вот метод действия контроллера
[HttpGet("{photoId}")]
public async Task<IActionResult> GetPhoto(intphotoId)
{
if (String.IsNullOrEmpty(photoid))
return NotFound();
var response = await _service.GetPhotoAsync(photoId);
Response.Headers.Add("Content-Disposition", new ContentDisposition()
{
FileName = "test.jpg",
Inline = true
}.ToString());
return File(response, "image/jpeg");
}