Изменение размера и сохранение изображения в базу данных
Решена первая проблема, приведенная ниже, но мне все еще нужно иметь возможность изменить размер / масштаб изображения, который использовался в моем коде при сохранении физического файла на сервере. Теперь он был сохранен в базе данных, он не работает..
Я вижу в своем коде, что я не передаю перемасштабированное изображение в InputStream, я передаю исходную файловую базу... возможно передать newImage каким-то образом, как его другого типа..?
У меня есть реальная проблема хранения / извлечения изображения из базы данных. Первоначально у меня был код, который позволял загружать изображение, изменять его размеры до требуемых размеров и сохранять как физический файл. Но теперь мне нужно сохранить изображение в базу данных (MS SQL).
Я использую MVC2 .NET 3.5
Мой код представляет собой смесь различных загрузок изображений, поэтому со мной все в порядке:)
Вот контроллер для загрузки:
[HttpPost]
public ActionResult ImageUpload(HttpPostedFileBase fileBase, PhotoViewModel photoViewModel)
{
if (photoViewModel.Button == "Upload")
{
photoViewModel.ImageValid = "Valid";
ImageService imageService = new ImageService();
if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength <= 2097152 && fileBase.ContentType.Contains("image/"))
{
Path.GetExtension(fileBase.ContentType);
var extension = Path.GetExtension(fileBase.FileName);
if (extension.ToLower() != ".jpg" && extension.ToLower() != ".gif") // only allow these types
{
photoViewModel.ImageValid = "Not Valid";
ModelState.AddModelError("Photo", "Wrong Image Type");
return View(photoViewModel);
}
EncoderParameters encodingParameters = new EncoderParameters(1);
encodingParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); // Set the JPG Quality percentage
ImageCodecInfo jpgEncoder = imageService.GetEncoderInfo("image/jpeg");
var uploadedimage = Image.FromStream(fileBase.InputStream, true, true);
Bitmap originalImage = new Bitmap(uploadedimage);
Bitmap newImage = new Bitmap(originalImage, 274, 354);
Graphics g = Graphics.FromImage(newImage);
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
var streamLarge = new MemoryStream();
newImage.Save(streamLarge, jpgEncoder, encodingParameters);
var fileExtension = Path.GetExtension(extension);
string newname;
if (photoViewModel.photoURL != null)
{
newname = photoViewModel.photoURL;
}
else
{
newname = Guid.NewGuid() + fileExtension;
}
//changed this up now, so it stores the image in db as apposed to physical path
photoViewModel.photo = newname;
photoViewModel.ContentType = fileBase.ContentType;
Int32 length = fileBase.ContentLength;
byte[] tempImage = new byte[length];
fileBase.InputStream.Read(tempImage, 0, length);
photoViewModel.ImageData = tempImage;
TempImageUpload tempImageUpload = new TempImageUpload();
tempImageUpload.TempImageData = tempImage;
tempImageUpload.ContentType = photoViewModel.ContentType;
photoViewModel.TempImageId = _service.InsertImageDataBlob(tempImageUpload);
originalImage.Dispose();
streamLarge.Dispose();
return View(photoViewModel);
}
if (fileBase != null)
{
if (fileBase.ContentLength > 0) ModelState.AddModelError("Photo", "Image size too small");
if (fileBase.ContentLength <= 2097152) ModelState.AddModelError("Photo", "Image size too big");
if (fileBase.ContentType.Contains("image/")) ModelState.AddModelError("Photo", "Wrong Image Type");
}
else ModelState.AddModelError("Photo", "Please upload a image");
if (!ModelState.IsValid)
{
photoViewModel.ImageValid = "Not Valid";
return View(photoViewModel);
}
}
return View(photoViewModel);
}
Вот мой класс репозитория:
public int InsertImageDataBlob(TempImageUpload tempImageUpload)
{
int ReturnedPhotoId;
try
{
var phototempdata = new Photo
{
ImageData = tempImageUpload.TempImageData,
contentType = tempImageUpload.ContentType,
dateUploaded = DateTime.Now
};
_db.Photos.InsertOnSubmit(phototempdata);
Save();
ReturnedPhotoId = phototempdata.id;
return ReturnedPhotoId;
}
catch (Exception ex)
{
//ErrorLogging;
}
return 0;
}
И поле данных изображения (тип изображения) в базе данных заполняется данными.
Любая помощь будет принята с благодарностью, я постепенно схожу с ума по этому!!
Спасибо
2 ответа
Я на самом деле получил его для работы с этим кодом:
photoViewModel.photo = newname;
photoViewModel.ContentType = fileBase.ContentType;
streamLarge.Position = 0;
byte[] tempImage = new byte[streamLarge.Length + 1];
streamLarge.Read(tempImage, 0, tempImage.Length);
photoViewModel.ImageData = tempImage;
Вероятно, это работает.. или нет:-P .... мои изменения в вашем коде для обхода / изменения масштаба (проверьте мои комментарии в вашем коде):
[HttpPost]
public ActionResult ImageUpload(HttpPostedFileBase fileBase, PhotoViewModel photoViewModel)
{
if (photoViewModel.Button == "Upload")
{
photoViewModel.ImageValid = "Valid";
ImageService imageService = new ImageService();
if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength <= 2097152 && fileBase.ContentType.Contains("image/"))
{
Path.GetExtension(fileBase.ContentType);
var extension = Path.GetExtension(fileBase.FileName);
if (extension.ToLower() != ".jpg" && extension.ToLower() != ".gif") // only allow these types
{
photoViewModel.ImageValid = "Not Valid";
ModelState.AddModelError("Photo", "Wrong Image Type");
return View(photoViewModel);
}
EncoderParameters encodingParameters = new EncoderParameters(1);
encodingParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); // Set the JPG Quality percentage
ImageCodecInfo jpgEncoder = imageService.GetEncoderInfo("image/jpeg");
var uploadedimage = Image.FromStream(fileBase.InputStream, true, true);
Bitmap originalImage = new Bitmap(uploadedimage);
Bitmap newImage = new Bitmap(originalImage, 274, 354);
Graphics g = Graphics.FromImage(newImage);
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
// change from originalImage to newImage
g.DrawImage(newImage, 0, 0, newImage.Width, newImage.Height);
var streamLarge = new MemoryStream();
newImage.Save(streamLarge, jpgEncoder, encodingParameters);
var fileExtension = Path.GetExtension(extension);
string newname;
if (photoViewModel.photoURL != null)
{
newname = photoViewModel.photoURL;
}
else
{
newname = Guid.NewGuid() + fileExtension;
}
//changed this up now, so it stores the image in db as apposed to physical path
photoViewModel.photo = newname;
photoViewModel.ContentType = fileBase.ContentType;
// using the memoryStream streamLarge
// old code: Int32 length = fileBase.ContentLength;
byte[] tempImage = new byte[streamLarge.Length];
// replace fileBase.InputStream with streamLarge
streamLarge.Read(tempImage, 0, length);
photoViewModel.ImageData = tempImage;
TempImageUpload tempImageUpload = new TempImageUpload();
tempImageUpload.TempImageData = tempImage;
tempImageUpload.ContentType = photoViewModel.ContentType;
photoViewModel.TempImageId = _service.InsertImageDataBlob(tempImageUpload);
originalImage.Dispose();
streamLarge.Dispose();
return View(photoViewModel);
}
if (fileBase != null)
{
if (fileBase.ContentLength > 0) ModelState.AddModelError("Photo", "Image size too small");
if (fileBase.ContentLength <= 2097152) ModelState.AddModelError("Photo", "Image size too big");
if (fileBase.ContentType.Contains("image/")) ModelState.AddModelError("Photo", "Wrong Image Type");
}
else ModelState.AddModelError("Photo", "Please upload a image");
if (!ModelState.IsValid)
{
photoViewModel.ImageValid = "Not Valid";
return View(photoViewModel);
}
}
return View(photoViewModel);
}