22 de set. de 2009

Redimensionar e Converter Imagem

 image

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: