image httppostedfilebase asp.net-mvc-file-upload

image - httppostedfilebase c#



¿Cómo se convierte un HttpPostedFileBase en una imagen? (2)

Estoy usando ASP.NET MVC y tengo una acción que carga el archivo. El archivo se está cargando correctamente. Pero quiero ancho y alto de la imagen. Creo que primero necesito convertir el HttpPostedFileBase a Image y luego proceder. ¿Cómo puedo hacer eso?

Y, por favor, avíseme si existe otra forma mejor de obtener el ancho y la altura de la imagen.


Si está seguro de que la fuente es imagen y no necesita edición, puede hacerlo fácilmente como se describe here

[HttpPost] public void Index(HttpPostedFileBase file) { if (file.ContentLength > 0) { var filename = Path.GetFileName(file.FileName); System.Drawing.Image sourceimage = System.Drawing.Image.FromStream(file.InputStream); } }

Para asegurar que el archivo sea una imagen, agregue la validación de JavaScript a Ver agregando el atributo accept con tipo MIME para ingresar la etiqueta

<input type="file" accept="image/*">

y script de validación jQuery

$.validator.addMethod(''accept'', function () { return true; });

La solución completa se puede encontrar here


Yo uso Image.FromStream de la siguiente manera:

Image.FromStream(httpPostedFileBase.InputStream, true, true)

Tenga en cuenta que la Image devuelta es IDisposable .

Necesitará una referencia a System.Drawing.dll para que esto funcione, y la Image está en el espacio de nombres System.Drawing .

Cambiar el tamaño de la imagen

No estoy seguro de lo que intenta hacer, pero si está haciendo miniaturas o algo similar, puede interesarle hacer algo como ...

try { var bitmap = new Bitmap(newWidth,newHeight); using (Graphics g = Graphics.FromImage(bitmap)) { g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(oldImage, new Rectangle(0,0,newWidth,newHeight), clipRectangle, GraphicsUnit.Pixel); }//done with drawing on "g" return bitmap;//transfer IDisposable ownership } catch { //error before IDisposable ownership transfer if (bitmap != null) bitmap.Dispose(); throw; }

donde clipRectangle es el rectángulo de la imagen original que desea escalar en el nuevo mapa de bits (deberá tratar manualmente la relación de aspecto). El catch-block es IDisposable uso típico IDisposable dentro de un constructor; usted mantiene la propiedad del nuevo objeto IDisposable hasta que se devuelva (es posible que desee hacerlo con comentarios de código).

Guardando como Jpeg

Desafortunadamente, el codificador predeterminado "guardar como jpeg" no expone ningún control de calidad y elige una calidad predeterminada terriblemente baja.

Sin embargo, puede seleccionar manualmente el codificador y luego puede pasar parámetros arbitrarios:

ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders() .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First(); using (EncoderParameters encParams = new EncoderParameters(1)) { encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)quality); //quality should be in the range [0..100] image.Save(outputStream, jpgInfo, encParams); }