Guardar información de una imagen en un archivo de texto


A raíz de la partida del imageBuque de Investigación Científica (BIC) Humboldt uno de mis conocidos me preguntó, “¿Existirá la forma de grabar la información de una imagen en un archivo de texto y esta a su vez que pueda luego ser leída como imagen?”, esto por que según me comenta los miembros de la expedición solo pueden enviar archivos de texto a través de un programa que ellos tienen.

Pues me comprometí a apoyarlos en algo, tal vez no sea una súper mega archí excelente solución pero espero que les pueda ayudar. Simplemente nos basamos en la forma como grabamos una imagen en una base de datos, por ejemplo SQL Server,  el tipo de dato para la imagen debería ser un image, por lo tanto lo que debemos grabar en el campo de imagen seria un arreglo de bytes. Entonces si podemos obtener un arreglo de bytes para mandarlo a la base de datos, ¿Por qué no lo mandamos a un archivo de texto? Sonrisa

Primero hagamos referencia a System.IO;

using System.IO;

Luego declaramos 2 variables que van a ser útiles en la aplicación, uno para obtener el arreglo de bytes y otro para saber cual es el nombre de la imagen.

private byte[] foto;
private string nombreImagen;

El botón buscar imagen debe generar el arreglo de byte que tiene la información de la imagen, para esto nos vamos a valer de una función llamada CargarImagen.

private void btnBuscarImagen_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog())
    {
        ofd.Title = "Buscar imagen";
        ofd.Filter = "Archivos Jpg(*.jpg)|*.jpg|Archivos Png(*.png)|*.ppg|Archivos Gif(*.gif)|*.gif";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            pbFoto.Load(ofd.FileName);
            nombreImagen = Path.GetFileNameWithoutExtension(ofd.FileName);
            foto = CargarImagen(ofd.FileName);
        }
    }
}

Los botones Generar .txt y Leer .txt utilizara a los miembros de la clase System.IO, tanto para la generación y lectura del archivo txt.

private void btnGenerarArchivo_Click(object sender, EventArgs e)
{
    using (FolderBrowserDialog fbd = new FolderBrowserDialog())
    {
        fbd.Description = "Seleccione la ubicación del archivo" ;
        if (fbd.ShowDialog()== System.Windows.Forms.DialogResult.OK)
        {
            MemoryStream ms = new MemoryStream(foto);
            using (FileStream fs = new FileStream(fbd.SelectedPath + "\\" +
                nombreImagen + ".txt", FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < foto.Length - 1; i++)
                    {
                        sb.AppendFormat("{0},", foto[i]);
                    }
                    sw.Write(sb.ToString());
                }
            }
        }
    }
}

private void btnLeerArchivo_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog())
    {
        ofd.Title = "Buscar archivo txt";
        ofd.Filter = "Archivos de texto(*.txt)|*.txt";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string archivoTxt = ofd.FileName;
            string[] sfoto;
            byte[] foto1;
            using (FileStream fs = new FileStream(archivoTxt, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (StreamReader sr = new StreamReader(fs))
                {
                    sfoto = sr.ReadLine().Split(',');
                }
            }
            foto1 = new byte[sfoto.Length];
            for (int i = 0; i < sfoto.Length - 1; i++)
            {
                foto1[i] = Convert.ToByte(sfoto[i]);
            }
            MemoryStream ms = new MemoryStream(foto1);
            pbFoto.Image = Image.FromStream(ms);
        }
    }
}

Y por ultimo creamos la función CargarImagen

private byte[] CargarImagen(string rutaImagen)
{
    long tamaño = new FileInfo(rutaImagen).Length;
    byte[] byteFoto = new byte[tamaño];
    using (FileStream fsImagen = new FileStream(rutaImagen, FileMode.Open, FileAccess.Read))
    {
        try
        {
            fsImagen.Read(byteFoto, 0, (int)tamaño);
        }
        catch (Exception)
        {
            throw new Exception("No se puede cargar la imagen");
        }
    }
    return byteFoto;
}

Espero que este post sea de ayuda, Saludos Sonrisa

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s