Foros del Web » Programación para mayores de 30 ;) » .NET »

Calidad del JPG al redimensionar imagen

Estas en el tema de Calidad del JPG al redimensionar imagen en el foro de .NET en Foros del Web. Hola, estoy redimensionando una imagen, lo que hago es reducirla en su tamaño un poco, el caso es que al reducirla la foto se comprime ...
  #1 (permalink)  
Antiguo 19/05/2006, 17:55
Avatar de cokete  
Fecha de Ingreso: noviembre-2004
Mensajes: 224
Antigüedad: 20 años
Puntos: 0
Calidad del JPG al redimensionar imagen

Hola, estoy redimensionando una imagen, lo que hago es reducirla en su tamaño un poco, el caso es que al reducirla la foto se comprime demasiado ...creo.. y pierde muchisima calidad, aunque la reduzca tan solo en unos pocos pixels.....

No utilizo ningun componente, lo hago con .net... A ver si alguien me puede decir como indicarle que no aplique tanta compresion al jpg....

Aqui dejo el codigo que utilizo:

Código:
Dim Imagen as System.Drawing.Image
Dim Filename as String
Filename=Request.QueryString("pathimagen")
		
Imagen = Imagen.FromFile(Filename)

' Definimos las dimensiones de la miniatura 
Dim AnchoMiniatura as Integer, AltoMiniatura as Integer 
Anchominiatura=Request.QueryString("Ancho")Altominiatura=Request.QueryString("Alto")
		
' Definimos el nombre del archivo, y el nombre de la miniatura 
Dim NombreArchivo as String, NombreMiniatura as String 
NombreMiniatura = Request.QueryString("nombre") & "p" 

' Definimos las rutas donde grabará los archivos 
Dim RutaArchivo as String, RutaMiniatura as String 
RutaMiniatura = Request.QueryString("pathdir") 
		
' Creamos la Miniatura con las dimensiones enviadas, y la definimos como 
Dim Miniatura as System.Drawing.Image 
Miniatura = Imagen.GetThumbnailImage(AnchoMiniatura, AltoMiniatura, Nothing, New IntPtr()) 

' Grabamos la Miniatura en disco con formato JPG 
Miniatura.Save(Server.MapPath(RutaMiniatura & NombreMiniatura), ImageFormat.JPEG) 

' Redirigimos la página hacia la imagen 
Response.Redirect(Request.QueryString("origen"))
  #2 (permalink)  
Antiguo 19/05/2006, 18:32
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Si, lo que sucede es que el GDI no guarda los jpgs con la máxima calidad posible, por ende, se ven bastante feos si son grandes, básicamente necesitas obtener los CODECS(compression/decompression) para el formato y después, establecer la calidad, de modo que la forma en la que guardas la imagen cambiará un poco.

Necesitarás utilizar System.Drawing y System.Drawing.Imaging

Te dejo un ejemplo rápido (C#):

Código:
public virtual ImageCodecInfo GetImageCodec(string imageType)
{
	ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
	ImageCodecInfo codecType = null;
	for (int x = 0; x < arrayICI.Length; x++)
	{
		if (arrayICI[x].FormatDescription.Equals(imageType))
		{
			codecType = arrayICI[x];
			break;
		}
	}
	return codecType;
}

public virtual EncoderParameters GetEncoderParameters()
{
	//Set default quality for images
	System.Drawing.Imaging.EncoderParameters encoderParams = new System.Drawing.Imaging.EncoderParameters();
	//0 - 100 Highest possible quality
	long[] quality = new long[1];
	quality[0] = Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["ImageQuality"].ToString());
	System.Drawing.Imaging.EncoderParameter encoderParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
	//System.Drawing.Imaging.Encoder.
	encoderParams.Param[0] = encoderParam;
	//End Quality
	
	return encoderParams;
}

Código:
outBitmap.Save( thumbnailStream, image.GetImageCodec("JPEG"), encoderParams );
Donde:
- outBipmap es mi mapa de bits
- thumbnailStream es mi stream
- Utilizo una clase image para y los métodos son los de arriba.


Saludos

[EDIT]Ten cuidado con la calidad de la image, yo nunca la pude establecer a 100, la dejé en 95 en el webconfig[/EDIT]
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 19/05/2006, 21:11
Avatar de affv  
Fecha de Ingreso: diciembre-2002
Ubicación: Ahora aqui
Mensajes: 485
Antigüedad: 21 años, 11 meses
Puntos: 0
podria alguien por favor traducir este codigo a vb es que no me llevo muy bien con c#
__________________
Todo tiene un comienzo y un fin!!
Postea tus proyectos
  #4 (permalink)  
Antiguo 23/05/2006, 11:58
Avatar de cokete  
Fecha de Ingreso: noviembre-2004
Mensajes: 224
Antigüedad: 20 años
Puntos: 0
Si por diossss alguien que lo ponga un poco mas explicito....y en VB pleaseeeeeeeee
Gracias
  #5 (permalink)  
Antiguo 28/05/2006, 09:37
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 10 meses
Puntos: 4
ya pudieron ?
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #6 (permalink)  
Antiguo 02/06/2006, 19:04
Avatar de cokete  
Fecha de Ingreso: noviembre-2004
Mensajes: 224
Antigüedad: 20 años
Puntos: 0
Por Fin.....

Querido amigo Lexus.... ya he encontrado algo realmente que merezca la pena... por lo menos para lo que yo necesito. Te explico.

Es una simple pagina aspx, codificada en C, pero vamos que no hay que tocarla para nada. Funciona de la siguiente manera.

Metes en cualquier pagina, ya sea asp o html la imagen con este formato y fuera.

Código HTML:
<img src="thumbnail.aspx?ForceAspect=False&Width=140&image=images/foto1.jpg"> 
De esta manera te muestra la imagen redimensionada, con una calidad medianamente buena, no como lo que habia visto anteriormente. Y sin ningún problema. Encontre no hace mucho un codigo que hacia lo mismo pero no me dejaba manipular la imagen despues de mostrarla.... esto funciona a la perfección.

Te paso aqui el codigo del archivo thumbnail.aspx

Código:
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
	try{
		Response.Cache.VaryByParams["Image;Width;Height;ForceAspect"] = true;
		Response.ContentType = "image/jpeg";
		System.Collections.Hashtable imageOutputFormatsTable = new System.Collections.Hashtable();
		imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Gif.Guid, System.Drawing.Imaging.ImageFormat.Gif);
		imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Jpeg.Guid, System.Drawing.Imaging.ImageFormat.Jpeg);
		imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Bmp.Guid, System.Drawing.Imaging.ImageFormat.Gif);
		imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Tiff.Guid, System.Drawing.Imaging.ImageFormat.Jpeg);
		imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Png.Guid, System.Drawing.Imaging.ImageFormat.Jpeg);
	
		string imageLocation;
		bool forceaspect = true;
		int newHeight;
		int newWidth;
		int reqHeight = 100;
		int reqWidth = 100;
		int origHeight;
		int origWidth;
		
		imageLocation = Server.MapPath(Request.QueryString["Image"]);
		if (Request.QueryString["Height"] != null){
			reqHeight = Convert.ToInt32(Request.QueryString["Height"]);
		}
		if (Request.QueryString["ForceAspect"] != null){
			forceaspect = Convert.ToBoolean(Request.QueryString["ForceAspect"]);
		}
		if(Request.QueryString["Width"] != null){
			reqWidth = Convert.ToInt32(Request.QueryString["Width"]);
		}
		if (Request.QueryString["ForceAspect"] == "true"){
			forceaspect = true;
		}
		
		System.Drawing.Bitmap origBitmap = new System.Drawing.Bitmap(imageLocation);
		origHeight = origBitmap.Height;
		origWidth = origBitmap.Width;
		
		if (forceaspect){
			//Force Aspect Change
			newHeight = reqHeight;
			newWidth = reqWidth;
		}		
		else{ 
			//Landscape
			newWidth = reqWidth;
			newHeight = (int)(((double)origBitmap.Height / (double)origBitmap.Width) * reqWidth);
		}		
		
		System.Drawing.Bitmap outputImage = new System.Drawing.Bitmap(origBitmap, newWidth, newHeight);
		//outputImage.SetResolution(24, 24); //use this line for lower resolution thumbnails
		outputImage.SetResolution(72, 72); 
					
		//outputImage.InterpolationMode = InterpolationMode.HighQualityBicubic;
		System.Drawing.Imaging.ImageFormat outputFormat = (System.Drawing.Imaging.ImageFormat)imageOutputFormatsTable[origBitmap.RawFormat.Guid];
		
		outputImage.Save(Response.OutputStream, outputFormat);
		outputImage.Dispose();
		origBitmap.Dispose();
	}
	catch (Exception ex){
		//log error so we may know the problem. you need to have write permits, of course on log path			
		System.IO.StreamWriter sw=null;
		try{
			sw=new System.IO.StreamWriter(Server.MapPath("error.txt"),true);
			sw.WriteLine("Error : " + ex.Message + " processing " + Request.QueryString["Image"]);
		}	 
		catch{}		
		finally{sw.Close();}
		//now display the error image
		Response.Redirect("thumberror.gif");
	}
}
</script>
A mi me funciona perfect, si teneis alguna duda escribirme....
Un Saludo a todos.
  #7 (permalink)  
Antiguo 23/07/2006, 15:24
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 10 meses
Puntos: 4
oye gracias por el codigo, sera posible modificar el codigo para que la imagen se guarde en disco duro?
necesito no solo que se muestre sino que se almacene tambien.

la idea general es subir una imagen de cualquier dimension (esto ya lo tengo) ahora con este codigo tuyo lo que hace es redimensionarla proporcionalmente si dañar su calidad. hasta alli va perfectgo, ahora solo me faltaria guardar esa imagn resultante.
despues tambien me gustaria que se puidiera guardar en otro tamaño osea uno grande y uno pequeñito
por ejemplo
original = 800*600
modificada = 340*200
miniatura = 80*60

sera posible resolver alguna de mis dudas? con que me ayudes a solo guardarla ya es mucho para mi.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #8 (permalink)  
Antiguo 24/07/2006, 13:25
Avatar de jocks  
Fecha de Ingreso: marzo-2004
Mensajes: 174
Antigüedad: 20 años, 7 meses
Puntos: 0
aspect ratio no cambia

bueno tuve la oportunidad de hacer algo parecido para lo cual use una clace q encontre en internet q me permitia redimensionar la iamgen sin perder el ASPECT RATIO de la imagen, me sirvio d mucho, si te interesa dimelo y te puedo alcanzar el enlace....
saludos
__________________
JUST DO IT!!!
nunk hay una segunda oportunidad para una primera buena impresion...
  #9 (permalink)  
Antiguo 24/07/2006, 13:30
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 10 meses
Puntos: 4
ok damelo, me interesa eso qeu dices y ademas guardar esa imagen resultante en el disco se puede?¿
gracias.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:43.