After 3 hours of debugging and searching I have this.
public Stream ResizeImageToThumbnail(Stream imageStream, int width)
{
var image = Image.FromStream(imageStream);
var height = (width * image.Height) / image.Width;
var thumbnail = image.GetThumbnailImage(width, height, null, IntPtr.Zero);
using var thumbnailStream = new MemoryStream();
thumbnail.Save(thumbnailStream, ImageFormat.Jpeg);
return thumbnailStream;
}
Problem is, it returns exception
ArgumentException: Parameter is not valid.
at
var image = Image.FromStream(imageStream);
Parameter is file.OpenFileStream(); where file is IFormFile.
I'm out of ideas.
Edit
Requested code:
foreach (var item in model.UploadedImages) //item = IFormFile, image only allowed from HTML's end
{
using var ms = item.OpenReadStream();
_service.AttachImage(newId, ms, item.FileName);
ms.Position = 0;
_service.AttachThumb(newId, ms, item.FileName); //cannot access a closed stream exception
}
Edit 2
AttachThumb is using closed stream, returns exception (check comment). It appears that ResizeImageToThumbnail returns closed stream.
public void AttachThumb(Guid id, Stream imageStream, string imageName)
{
Post post = GetPost(id);
ObjectId imageId = _gridFS.UploadFromStream(imageName, ResizeImageToThumbnail(imageStream, 640)); //cannot use closed stream
post.ImagesThumbs.Add(imageId.ToString());
var filter = Builders<Post>.Filter.Eq(x => x.Id, id);
var update = Builders<Post>.Update.Set("ImagesThumbs", post.ImagesThumbs);
_posts.UpdateOne(filter, update);
}
public Stream ResizeImageToThumbnail(Stream imageStream, int width)
{
var image = Image.FromStream(imageStream);
var height = (width * image.Height) / image.Width;
var thumbnail = image.GetThumbnailImage(width, height, null, IntPtr.Zero);
using var thumbnailStream = new MemoryStream();
thumbnail.Save(thumbnailStream, ImageFormat.Jpeg);
return thumbnailStream;
}