У меня есть форма (с использованием MVC2), в которой есть скрипт загрузки изображений, но правила для окончательного изображения, хранящегося на сервере, довольно строги.Я могу принудительно установить размер файла, который мне нужен, но он всегда превышает размер файла, требуемый ... поэтому я могу разрешить изображение размером менее 200 Кб, но после обработки моего кода оно становится немного больше.
Вот правила, которых я должен придерживаться:
- Фотографии должны быть цветными
- Допустимые типы изображений для фотографии: .JPG или .GIF
- Максимальный размер изображения составляет 200 КБ
- Размеры фотографии на значке будут составлять 274 пикселя (в ширину) x 354 пикселя (в высоту) @ 200 точек на дюйм (глубина пикселей на дюйм)
Это то, что у меня есть в данный момент:
[HttpPost]
public ActionResult ImageUpload(HttpPostedFileBase fileBase)
{
ImageService imageService = new ImageService();
if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength < 204800 && fileBase.ContentType.Contains("image/"))
{
string profileUploadPath = "~/Resources/images";
Path.GetExtension(fileBase.ContentType);
var newGuid = Guid.NewGuid();
var extension = Path.GetExtension(fileBase.FileName);
if (extension.ToLower() != ".jpg" && extension.ToLower() != ".gif") // only allow these types
{
return View("WrongFileType", extension);
}
EncoderParameters encodingParameters = new EncoderParameters(1);
encodingParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 70L); // 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);
var ImageName = newGuid + fileExtension;
newImage.Save(Server.MapPath(profileUploadPath) + ImageName);
//newImage.WriteAllBytes(Server.MapPath(profileUploadPath) + ImageName, streamLarge.ToArray());
originalImage.Dispose();
newImage.Dispose();
streamLarge.Dispose();
return View("Success");
}
return View("InvalidImage");
}
Просто добавлю: изображения отправляются на печать на карту, поэтому значение DPI важно.Но я понимаю, что 200К - это не много для печатного изображения ... ни одно из этих правил не является моим!Как и в случае с этим кодом, загруженное изображение размером почти 200 КБ в итоге стоит 238 КБ (иш)
.