#c# #asp.net #asp.net-mvc #asp.net-core #asp.net-core-mvc
Вопрос:
Я попытался сжать изображение с помощью пакета Imagesharp Nuget и сохранить его в своей базе данных sql в виде большого двоичного объекта, но проблема в том, что изображение успешно сжато.. но не в сжатом изображении хранится только исходное изображение, пример: Pictureone.jpg размер изображения составляет 3 МБ..после загрузки размер изображения сжимается до 40 Кб, но когда я подал заявку на сохранение в базе данных, этот сжатый файл сохранил исходный (3 МБ). Вот мой код
Модель BlobImage.cs
namespace ImageToDb.Models
{
public class BlobImg
{
public int id { get; set; }
public string name { get; set; }
public byte[] image { get; set; }
}
}
ImageController.cs
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
[HttpPost]
public async Task<IActionResult> Index(IFormFile file, BlobImg bolb)
{
string fileName = string.Empty;
string path = string.Empty;
var files = HttpContext.Request.Form.Files;
if (file.Length > 0)
{
using (var img = Image.Load(file.OpenReadStream()))
{
string newSize = ResizeImage(img, 500, 500);
string[] aSize = newSize.Split(',');
img.Mutate(h => h.Resize(Convert.ToInt32(aSize[1]), Convert.ToInt32(aSize[0])));
//This section save the image to database using blob
foreach (var item in files)
{
if (item.Length > 0)
{
using (var stream = new MemoryStream())
{
await item.CopyToAsync(stream);
bolb.image = stream.ToArray();
}
}
}
}
;
}
return View();
}
public string ResizeImage(Image img, int maxWidth, int maxHeight)
{
if (img.Width > maxWidth || img.Height > maxHeight)
{
double widthRatio = (double)img.Width / (double)maxWidth;
double heightRatio = (double)img.Height / (double)maxHeight;
double ratio = Math.Max(widthRatio, heightRatio);
int newWidth = (int)(img.Width / ratio);
int newHeight = (int)(img.Height / ratio);
return newHeight.ToString() "," newWidth.ToString();
}
else
{
return img.Height.ToString() "," img.Width.ToString();
}
}
Ответ №1:
Вы сжимаете изображение в этой строке:
img.Mutate(h => h.Resize(Convert.ToInt32(aSize[1]), Convert.ToInt32(aSize[0])));
Затем вы больше не ссылаетесь на него ни в одном последующем коде и (я предполагаю) сохраняете все в файлах HttpContext.Request.Form.вместо этого. Вместо этого сохраните объект «img» в базе данных вместо этого. Я не вижу никакого кода, который на самом деле сохраняет что-либо в базе данных, независимо от того, но я подозреваю, что это проблема, основанная на вашем описании. Так что ваш код, скорее всего, в порядке, вы просто сохраняете неправильную вещь.
Попробуйте это, вам нужно будет самостоятельно определить формат изображения:
public async Task<IActionResult> Index(IFormFile file, BlobImg bolb)
{
if (file.Length > 0)
{
using (var img = Image.Load(file.OpenReadStream()))
{
string newSize = ResizeImage(img, 500, 500);
string[] aSize = newSize.Split(',');
img.Mutate(h => h.Resize(Convert.ToInt32(aSize[1]), Convert.ToInt32(aSize[0])));
//This section save the image to database using blob
using (var ms = new MemoryStream())
{
img.Save(ms, imageFormat);
bolb.image = ms.ToArray();
}
}
}
return View();
}
Комментарии:
1. выше моего кода после запуска, когда я сохраняю изображение В базе данных, сохраняя исходное изображение, а не сжатое, но я хочу сохранить сжатое изображение.
2. Укажите, пожалуйста, строку, в которой вы сохраняете изображение в базе данных?
3. это первая область действия индекса.. Я меняю его на код..
4. Область foreach не ссылается на объект «img», который вам нужно сохранить. Вы сохраняете содержимое «файлов» (то есть «HttpContext.Request.Form.Files») вместо сохранения «img», которое является вашим сжатым изображением.
5. Поэтому, если я назову
var image= img.Mutate(h => h.Resize(Convert.ToInt32(aSize[1]), Convert.ToInt32(aSize[0])));
его ошибкой получения или назову его прямымforeach(var item in img)
, также получающим ошибку