Pessoal, hoje precisei novamente de manipular imagens e não tinha meu note por perto com as bibliotecas que precisava. Resultado: refiz e refiz melhor uma classe usando Extension Methods para redimensionar imagens sem distorcer e realizar as conversões entre byte[] e Image.
Segue a classe:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;namespace ExtensionImages
{
/// <summary>
/// Classe para manipulação básica de imagens,
/// como redimensionamento e conversão para bytes.
/// .NET 4.0 (Pode facilmente ser convertida para .NET 3.5).
/// </summary>
public static class ImageUtils
{
/// <summary>
/// Redimensiona a imagem proporcionalmente,
/// sem distorcer.
/// </summary>
/// <param name="img">Imagem</param>
/// <param name="tamanhoBase">Tamanho Máximo de Altura ou Largura.</param>
/// <returns>Uma Image com a Imagem Redimensionada.</returns>
public static Image Resize(this Image img, int tamanhoBase = 100)
{
int altura = img.Height;
int largura = img.Width;// -> Verifica se a imagem é maior (em largura ou altura) do que o tamnho desejado.
if (img.Width > tamanhoBase || img.Height > tamanhoBase)
{
if (img.Width > img.Height) // -> Acerta na Horizontal.
{
altura = (tamanhoBase * img.Height) / img.Width;
largura = tamanhoBase;
}
else // -> Acerta na Vertical.
{
largura = (tamanhoBase * img.Width) / img.Height;
altura = tamanhoBase;
}
}
// -> Redimensiona com os novos tamanhos.
img = img.GetThumbnailImage(largura, altura, null, new System.IntPtr(0));return img;
}/// <summary>
/// Converte para um array de Bytes
/// </summary>
/// <param name="img">Imagem</param>
/// <param name="frmt">Formato(JPEG, PNG etc.), o padrão é PNG.</param>
/// <returns>Array de Bytes.</returns>
public static byte[] ToBytes(this Image img, ImageFormat fmt = null)
{
// -> Seta o valor padrão para o Formato caso seja Nulo.
if (fmt == null)
fmt = ImageFormat.Png;// -> Salva a imagem no MemoryStream e retorna o array de bytes.
using (var ms = new MemoryStream())
{
img.Save(ms, fmt);
return ms.ToArray();
}
}/// <summary>
/// Converte um array de bytes em uma Image.
/// </summary>
/// <param name="bytesImage">bytes da imagem.</param>
/// <returns>Uma Image.</returns>
public static Image ToImage(this Byte[] bytesImage)
{
// -> Carrega uma imagem do stream e retorna.
using (var ms = new MemoryStream(bytesImage))
{
return Image.FromStream(ms);
}
}
}
}
Lembrando que a classe e os métodos tem que serem “static” para funcionarem como Extensions.
Qualquer coisa me reportem. Bom uso!!
0 comentários:
Postar um comentário