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);
}