Olá amigos, hoje vou compartilhar com vocês uma pequena dica para obter thubnails com qualidade superior aos gerados pelo método GetThumbnailImage() da classe System.Drawing.Image. Em muitos casos gerar um thumbnail de qualidade é fundamental, isso por que o thumbnail nem sempre é uma mera referência da imagem maior, as vezes ele tem um destaque muito maior e para olhos mais treinados, a diferença de qualidade do mesmo em relação à imagem original pode ser algo inaceitável.

Sempre que as pessoas procuram por uma maneira de obter thumbnails em .net, as primeiras páginas de resultados apresentam soluções utilizando o método mais fácil e rápido, mas que infelizmente não é o mais flexível e confiável (no que diz respeito à qualidade da imagem gerada). Veja abaixo as diferenças:

Digamos que você tenha obtido um objeto System.Drawing.Image a partir de um InputStream do FileUpload do Asp.Net, da seguinte maneira:

System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload.PostedFile.InputStream);
System.Drawing.Image thumb = image.GetThumbnailImage(50, 50, null, IntPtr.Zero);

O passo seguinte é apenas salvar o objeto thumb.

thumb.Save("C:\\thumb.jpg");

Este método funciona bem, porém não permite configurações de qualidade… e internamente “arrebenta” com a imagem. Uma alternativa para gerar os thumbnails é usar a classe Bitmap.

System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload.PostedFile.InputStream);
using (var thumb = new Bitmap(50, 50))
{
	using (Graphics g = Graphics.FromImage(thumb))
	{
		g.InterpolationMode = InterpolationMode.HighQualityBicubic;
		g.DrawImage(image, new Rectangle(0, 0, 50, 50);
	}
	thumb.Save("C:\\thumb.jpg");
}

Você pode conferir o resultado abaixo. Repare que o tamanho em bytes das imagens ficou muito próximo, porém a qualidade da imagem é imensamente superior em favor do método da classe Bitmap.

Bitmap.DrawImage()
4,10 kbyes
Image.GetThumbnailImage()
3,81 kbytes

 

Fica a dica…

Até a próxima,