Manejo de Imagenes con C#

11
APLICACIモN CON IMチGENES CON C# Vamos a crear una BDD propia con una tabla clientes tal como se muestra en el script luego a través de un formulario se va a realizar la gestión correspondiente de grabar y leer imágenes de la tabla : El código de cliente se genera. Primer paso vamos a elaborar los procedimientos almacenados en sql 2005 use master create database Imagen go use Imagen go create table ImagCliente( codigo char(5)primary key, nombre varchar(50),

description

Cargando y leeyendo imagenes desde una tabla en C#, se hace de cuadros de dialogo para buscar las imagenes de un directorio

Transcript of Manejo de Imagenes con C#

APLICACIÓN CON IMÁGENES CON C#

Vamos a crear una BDD propia con una tabla clientes tal como se muestra en elscript luego a través de un formulario se va a realizar la gestión correspondientede grabar y leer imágenes de la tabla :

El código de cliente se genera.

Primer paso vamos a elaborar los procedimientos almacenados en sql 2005

use mastercreate database Imagengouse Imagengocreate table ImagCliente(codigo char(5)primary key,nombre varchar(50),

foto image)select * from ImagClientedelete from ImagClientego------------------------------------------create proc img_MostrarClientesasselect * from ImagClientego------

create proc Imag_uspgenerarcodigo@codigo char(5) outputasSet @codigo=(select max(codigo) from ImagCliente )Set@codigo='C'+right('000'+ltrim(right(isnull(@codigo,'0000'),4)+1),4)godeclare @codigo char(5)exec Imag_uspgenerarcodigo @codigo outputprint @codigogo----------------------------------------create proc Imag_uspgrabarcliente@codigo char(5),@nombre varchar(50),@foto imageasinsert into ImagCliente values(@codigo,@nombre,@foto)go-------------------------------create proc Img_Buscarclientes@codigo char(5)asselect * from ImagCliente where codigo=@codigo

Paso 2: Codigo en un formulario en C#.

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;

using System.Data.SqlClient;using System.IO;//Libreria para controlar archivos de Entrada/ Salidanamespace GuardandoImagenes{

public partial class Form1 : Form{

public Form1(){

InitializeComponent();}

SqlConnection cn = newSqlConnection("Server=(local);IntegratedSecurity=SSPI;Database=Imagen");private long m_lImagenFileLength=0; //Logitud delarchivo de//la imagenbyte[] m_barrImg;

void cargaimagen(){//OpenFileDialog -->Permite al usuario abrir un archivoOpenFileDialog open1 = new OpenFileDialog();

//Asignando el tipo de archivo a leer//OpenFileDialog1.Filter="txt files(*.txt)|*.txt|All//files(*.*)|*.*";open1.Filter = "ImagenFiles(*.BMP,*.JPG,*.GIP)|*.BMP,*.JPG,*.GIP|Allfiles(*.*)|*.*";

open1.FilterIndex = 2;open1.RestoreDirectory = true;open1.ShowDialog();//Abriendo la cja de dialogo

//para selecionar un archivo//Preguntando si ha selecionado o no un archivoif(string.IsNullOrEmpty(open1.FileName))

{MessageBox.Show("Selecione un Imagen");return;//Saliendo del procedimiento

}string strfoto = open1.FileName;//Especificando la posicion de la imagen

pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;//muestra la imagen desde una archivo especificado

pictureBox1.Image = Image.FromFile(strfoto);//Propotciona un metodo de instancia para la//creacion,eliminacion , mover la imagenFileInfo fiImage = new FileInfo(strfoto);

//obteniendo la logitud de la imagenthis.m_lImagenFileLength = fiImage.Length;

//FileStream ==> Expone un objeto Stream alrededor de u//archivo// se admiten operaciones de lectura y escritura sincronica

//y asincronicaFileStream fs = new FileStream(strfoto, FileMode.Ope n,FileAccess.Read, FileShare.Read);

//FileStream(string,FileMode,FileAccess,FileShare)//Inicializa una nueva instancia de la clase fileStream con//el permiso de uso compartido, el permiso de//lectura/escritura, el modo de creacion y la

//ruta de aceso especifico

//-----------------------------------------------------------------------m_barrImg = new

byte[Convert.ToInt32(this.m_lImagenFileLength)];// -----//-----------------------------------------------

------------------------//Read=> Lee un bloque de bytes de la secuencia y

escribe los datos en un bufer dado//-----------------------------------------------

---------------------------------//int iBystesRead = fs.Read(m_barrImg, 0,

Convert.ToInt16(m_lImagenFileLength));// --//-----------------------------------------------

--------------------------------//---------try{

int iBystesRead = fs.Read(m_barrImg, 0,Convert.ToInt16(m_lImagenFileLength));// --

if (iBystesRead > 23552){

iBystesRead = 0;pictureBox1.Image = null;MessageBox.Show("La imagen debe de ser

160 x 120 pixeles");return;

}}catch (Exception ex){

string a = ex.Message;pictureBox1.Image = null;

MessageBox.Show("Imagen muy grande");return;

}

//--------------------------------------------------------------------------------

//FileStream.Read(array,offset,count)//parametros//array//cuando devuelve el metdo ,contiene la matriz de

bytes//(offset+count)) reemplazada por los bytes

leidos desde el origen actual//offset//Desplazamiento de bytes en el parametro array

deonde debe comenzar la lectura//count//Numero maximo de bytes que se pueden leer//valor devuelto//numero total de bytes leidos en el bufer .Puede

ser menor que el numero de bytes solicitado si//ese numero decimal bytes no esta disponible

actualmente o cero si se ha alcanzado else final de lasecuencia

fs.Close();//Close()--> cierra la secuendia actual y libera

tados recursos//(cimi sockets e identificardores de archivo)

asociados a esta}private void Form1_Load(object sender, EventArgs e){

Limpia();}void mostrarclientes(){

SqlDataAdapter da = newSqlDataAdapter("img_MostrarClientes", cn);

DataTable tb1 = new DataTable();da.Fill(tb1);dataGridView1.DataSource = tb1;

dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);

}void MostrarcodigoGenerado(){

SqlCommand cmd = newSqlCommand("Imag_uspgenerarcodigo",cn);

cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("@codigo", SqlDbType.Char,

5).Direction = ParameterDirection.Output;cn.Open();cmd.ExecuteNonQuery();txtcod.Text = cmd.Parameters[0].Value.ToString();cn.Close();

}

private void btnBuscarImagen_Click(object sender,EventArgs e)

{cargaimagen();

}

private void btnGuardar_Click(object sender,EventArgs e)

{try{

SqlCommand cmd = newSqlCommand("Imag_uspgrabarcliente", cn);

cmd.CommandType =CommandType.StoredProcedure;

cmd.Parameters.Add("@codigo",System.Data.SqlDbType.Char, 5).Value = txtcod.Text;

cmd.Parameters.Add("@nombre",System.Data.SqlDbType.Char, 50).Value = txtnom.Text;

cmd.Parameters.Add("@foto",System.Data.SqlDbType.Image).Value = m_barrImg;

cn.Open();int iresult = cmd.ExecuteNonQuery();if (iresult == 1){

mostrarclientes();MessageBox.Show("Cliente Registrado");

}

}catch (Exception ex){ MessageBox.Show(ex.Message); }finally{

cn.Close();}

Limpia();}

private void btnNuevo_Click(object sender, EventArgse)

{Limpia();

}void Limpia(){

txtcod.Text = "";txtnom.Text = "";txtcod.Enabled = false;pictureBox1.Image = null;txtnom.Focus();mostrarclientes();MostrarcodigoGenerado();

}

private void btnSalir_Click(object sender, EventArgse)

{if(MessageBox.Show("Desea

Salir","Imagenes",MessageBoxButtons.YesNo,MessageBoxIcon.Information)==DialogResult.Yes)

{Application.Exit();

}}

private void button6_Click(object sender, Even tArgs e){try{if (string.IsNullOrEmpty(txtbuscar.Text)){MessageBox.Show("Ingrese un codigo a buscar");

return;}

SqlCommand cmd = new SqlCommand("Img_Buscarclientes", cn);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("@codigo", SqlDbType.Char, 5).Value =

txtbuscar.Text.ToString();cn.Open();

SqlDataReader dr = cmd.ExecuteReader();if (dr.HasRows == true){

dr.Read();txtcod.Text = dr[0].ToString();// campo codigotxtnom.Text = dr[1].ToString();// campo nombrebyte[] barrImg = (byte[])dr[2];// campo fotostring strfn =

Convert.ToString(DateTime.Now.ToFileTime());//FileStream(IntPtr,FileMode,FileAccess)//incializa una nueva instalcia de la clase FileStream con

//el permiso de lectura/Escritura,el modo de creacion y la//ruta de acceso especificado IntPtr ==> un indicador de//archivo para el archivo que el objeto FileStream actual va//a escapsular//FileMode ==>una constrante de FileAccess que obtinee laspropiedades CanRead y CamWrite

// del objeto//FileAccess ==> constante del FileAccess

que determina como el objtero FileStream puede obtener acceso// al archivo//Obtiene las propiedades CanRead y

CanWrite del objeto FileStream. CanSeek es TRUE si path//especifica un archivo de discoFileStream fs = new FileStream(strfn,

FileMode.CreateNew,FileAccess.Write);fs.Write(barrImg, 0, barrImg.Length);//Flush()=> borar todos los buferes de

esta secuencia y hace que todos los datos almacenados// en el bufer se escriban en el

dispositivo subyacentefs.Flush();fs.Close();pictureBox1.SizeMode =

PictureBoxSizeMode.StretchImage;pictureBox1.Image =

Image.FromFile(strfn);}else{

MessageBox.Show("No exite el registro");txtcod.Clear(); txtnom.Clear();

pictureBox1.Image = null;

}}catch (Exception ex){

MessageBox.Show(ex.Message);}

finally {cn.Close();

}}

}}

Al final debe de obtenerse el siguiente resultado:

Como tarea para que mida su capacidad y competencia realizarse el siguienteejercicio: empleando la BDD Neptuno

Susy Díaz Bustamante

Fernando Lértora Liñán