[C#] Conversor de imagens ...

Started by mephisto, 03 de July , 2008, 11:46:23 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

mephisto

/*
    * Componente    : Conversor de Imagens
    * Data Criação  : 21 - 06 - 2008
    * Desenvolvedor : Ricardo S. de Barros
   
    * Propósito     : Necessidade de redimensionar imagens, para processar em dispositivo PocketPC
                      o componente recebe a imagem em qualquer formato e converte para outro qualquer
                      em que ao fim a estrutura binária seja menor do que o original ficando com tamanho
                      em bytes muito menor facilitando envio/recebimento PocketPC <-> Servidor.
                     
*/

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;

namespace ConversorImagem
{
    public partial class ConversorImg : Component
    {
        #region Propriedades Internas

        private string m_sSaidaPadrao;
        private ImageFormat m_imgFormat;
        private bool bCompactar;
       
        #endregion

        #region Propriedades Publicas

        /// <summary>
        /// Propriedade que define o caminho que deverá ser a saída da imagem.
        /// </summary>
        public string SaidaPadrao
        {
            get { return m_sSaidaPadrao; }
            set { m_sSaidaPadrao = value; }
        }

        /// <summary>
        /// Propriedade que define o formato que a imagem deve ter após conversão.
        /// </summary>
        public ImageFormat FormatoImagem
        {
            get { return m_imgFormat; }
            set { m_imgFormat = value; }
        }

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor do componente que identifica onde deverá sair os arquivos.
        /// </summary>
        public ConversorImg(string sSaida, ImageFormat FormatoDesejado)
        {
            InitializeComponent();

            // Aplico na propriedade a saída especificada ...
            if (sSaida.Trim().Length != 0) SaidaPadrao = sSaida;

            // Aplico também o formato escolhido por usuário.
            FormatoImagem = FormatoDesejado;
        }

        #endregion


        /// <summary>
        /// Método que realiza extração do nome original do arquivo para gravar
        /// na saída escolhida por usuário.
        /// </summary>
        /// <param name="sArquivoAlvo">Path completo do arquivo</param>
        /// <returns>Retorna nome original</returns>
        private string ExtraiNomeArquivo(string sArquivo)
        {
            string sAuxi = "";
            string sNomeOriginal = "";

            // Laço por todos os caracteres do path recebido ...
            for (int i = 0; i <= sArquivo.Length - 1; i++)
            {
                // Realizo pesquisa caracter a caracter até achar o '.' (ponto separador) de toda extensão.
                if (sArquivo[i] == '.')
                {
                    // Se encontrou, realizo um laço de trás pra frente para pegar do
                    // '.'(ponto separador) até a primeira '\'(barra) sendo assim
                    // no meio dos dois consigo o nome do arquivo.
                    for (int j = i; j >= 0; j--)
                    {
                        // Procuro a barra 'andando' de trás pra frente se achar
                        // a barra termina também ..
                        if (sArquivo[j] == '\\') break;

                        // Enquanto procuro vou armazenando o espaço do ponto até a barra pois esse já é o nome
                        // porem ele vai ficar invertido ...
                        sAuxi += sArquivo[j];
                    }

                    // Como o nome virá invertido como no 'espelho' rotaciono ele para ficar correto.
                    for (int k = sAuxi.Length - 1; k > 0; k--)
                        sNomeOriginal += sAuxi[k];

                    // Caso não ache por qualquer motivo a barra, então depois do laço inverso termino
                    break;
                }
            }

            // Retorno o nome extraído.
            return sNomeOriginal;
        }

        /// <summary>
        /// Método que realiza o algoritmo de conversão do arquivo. usando biblioteca GDI+ (.NET)
        /// </summary>
        public void Converter(string sArquivo, int iAltura, int iLargura)
        {
            PictureBox pctBuffer = null;
            Image imgAux = null;
            Bitmap bmpAux = null;
            string sCaminho = "";
            string sExtensao = "";
            string sNome = "";

            try
            {
                // Transformo a imagem do caminho recebido em um buffer para utilizar depois.
                // utilizando um picturebox auxiliar ...
                pctBuffer = new PictureBox();
                pctBuffer.ImageLocation = sArquivo;

                // Carrego a imagem recebida. e envio a um objeto image para tratar.
                pctBuffer.Load();
                imgAux = pctBuffer.Image;

                // Com o image (Array Bytes) formado transformo em um bitmap para conversão.
                // Seto o tamanho final que ela deverá ficar.
                bmpAux = new Bitmap(imgAux, iAltura, iLargura);

                // Se a conversão foi sucedida ...
                if (bmpAux != null)
                {
                    // Chamo método que realiza extração do nome do arquivo para salvar no disco.
                    sNome = this.ExtraiNomeArquivo(sArquivo);

                    // Valido o formato escolhido, e atribuo a extensão apropriada ...
                    if(FormatoImagem == ImageFormat.Bmp) sExtensao = ".bmp";
                    if(FormatoImagem == ImageFormat.Jpeg) sExtensao = ".jpg";
                    if(FormatoImagem == ImageFormat.Png) sExtensao = ".png";
                   
                    // Formato o caminho que será salvo.
                    sCaminho = String.Format("{0}{1}.{2}", SaidaPadrao, sNome, sExtensao);

                    // Salvo a imagem no caminho recebido no construtor. com o nome que ela veio
                    // e com sua nova estrutura binária seja bmp/jpg/png.
                    bmpAux.Save(sCaminho, FormatoImagem);
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(String.Format("Ocorreu um erro no componente {0}", err.Message), "Atenção");               
            }
            finally
            {
                // Libero memória alocada.
                if (pctBuffer != null) pctBuffer.Dispose();
                if (imgAux != null) imgAux.Dispose();
                if (bmpAux != null) bmpAux.Dispose();
            }
        }
    }
}

Boa noite. vou contribuir com algo em memória dos velhos tempos. quem for veterano aqui irá entender.  :)

Abraços.
[]s.