captura imagen c#

Download captura imagen c#

Post on 16-Aug-2014

177 views

Category:

Documents

41 download

Embed Size (px)

TRANSCRIPT

 http://foros.solocodigo.com/index.php?showtopic=30381 public class WebCam {// Conserva esta cabecera // Empeorxdevil 2007 class SaveImage { // Conserva esta cabecera // Emperorxdevil 2007 /// /// Imagen que contiene la clase /// public Image Tmp; // referencia a la imagen del Picturebox Form Ref; // referencia que necesitare a este formulario Form Opciones; GroupBox Gr; RadioButton R1; RadioButton R2; RadioButton R3; TextBox Porciento; TextBox Larg; TextBox Anch; Label L1; Label L2; Button Acepta; Button Cancelar; SaveFileDialog Sv; DialogResult rs; /// /// Constructor de clase SaveImage /// /// Imagen que se va a guardar /// Si se mostrar Interfaz public SaveImage(Image imagen, bool Interfaz) { Tmp=imagen; // Asigno la imagen... Opciones= new Form(); Ref=Opciones; Opciones.Width=333; // Configuracion Opciones.Height=198; Opciones.Text="Parmetros de Imagen"; Opciones.ControlBox=false; Opciones.ShowInTaskbar=false; Opciones.FormBorderStyle=FormBorderStyle.FixedDialog; Gr= new GroupBox(); Gr.Width=288; Gr.Height=105; Gr.Text="Configuracin";Asociadodilogo// Objetos necesarios para formar elGr.Location= new Point(18,15); Porciento= new TextBox(); Porciento.Enabled=false; Configuracion//Porciento.Text=""; Porciento.Width=37; Porciento.Height=20; Porciento.MaxLength=3; Porciento.TextAlign=HorizontalAlignment.Center; Porciento.Location= new Point(147,47); R1= new RadioButton(); R1.Text="Guardar con Dimensiones Actuales"; R1.Width=191; R1.Height=17; Gr.Controls.Add(R1); R1.Location= new Point(18,25);R2 = new RadioButton(); R2.CheckedChanged += new EventHandler(R2_CheckedChanged); R2.Text="Reducir tamao al"; R2.Width = 115; // Configuracion R2.Height = 17; R2.Location= new Point(18,48); Gr.Controls.Add(R2); Gr.Controls.Add(Porciento); L1 = new Label(); L1.Text="%"; L1.AutoSize=true; L1.Location= new Point(195,50); Gr.Controls.Add(L1); R3 = new RadioButton(); R3.CheckedChanged += new EventHandler(R3_CheckedChanged); R3.Text="Cambiar tamao a"; // Configuracion R3.Width=113; R3.Height=17; R3.Location= new Point(18,71); Gr.Controls.Add(R3); L2 = new Label(); L2.Text="X"; L2.AutoSize=true; L2.Location=new Point(195,75); Gr.Controls.Add(L2); Larg= new TextBox(); Larg.Enabled=false; Larg.Width=37; Larg.Height=20; Larg.MaxLength=4; Larg.TextAlign=HorizontalAlignment.Center; Larg.Location= new Point(147,71); Gr.Controls.Add(Larg); Anch= new TextBox(); Anch.Enabled=false; Anch.Width=37; Anch.Height=20; Anch.MaxLength=4;Anch.TextAlign=HorizontalAlignment.Center; // Configuracion Anch.Location= new Point(218,70); Gr.Controls.Add(Anch); Acepta= new Button(); Acepta.Text="Aceptar"; Acepta.Width=59; Acepta.Height=26; Acepta.Location= new Point(247,133); Acepta.Click += new EventHandler(Acepta_Click); Cancelar= new Button(); Cancelar.Text="Cancelar"; Cancelar.Width= 59; Cancelar.Height=26; Cancelar.Location= new Point(18,133); Cancelar.Click += new EventHandler(Cancelar_Click); Opciones.Controls.Add(Gr); Opciones.Controls.Add(Acepta); Opciones.Controls.Add(Cancelar); Opciones.StartPosition=FormStartPosition.CenterScre en; } /// /// Constructor de la clase SaveImage sin Interfaz /// /// Imagen a Guardar public SaveImage(Image imagen) { Tmp = imagen; // Asigno la imagen... } { void R3_CheckedChanged(object sender, EventArgs e) Opciones.ShowDialog();if (this.R3.Checked) { this.Anch.Enabled=true; this.Larg.Enabled=true;} else {this.Anch.Enabled=false; this.Larg.Enabled=false; } } void R2_CheckedChanged(object sender, EventArgs e) { if (this.R2.Checked) { this.Porciento.Enabled=true;} else { this.Porciento.Enabled=false; } } void Acepta_Click(object sender, EventArgs e) { try { if (R1.Checked|| R2.Checked||R3.Checked) { if (R2.Checked) {Tmp=Resize(Tmp,Convert.ToInt32(Porciento.Text));} if (R3.Checked) {Tmp=Resize(Tmp,Convert.ToInt32(Larg.Text),Convert.ToInt32(Anch.Text)); }para salvar la imagen configuroSv= new SaveFileDialog(); // Creo un dilogo Sv.Title = "Guardar imagen como..."; // LoSv.Filter = "Archivo JPG|*.jpg|Archivo PNG| *.png|Archivo GIF|*.gif|Mapa de Bits|*.bmp"; rs = Sv.ShowDialog(); // Lo muestro modal if (rs == DialogResult.OK) { extensin seleccionada int x = Sv.FilterIndex; // Ontengo la switch (x) { // Salvo la imagen en el formato deseado case 1: Tmp.Save(Sv.FileName, ImageFormat.Jpeg); break; case 2: Tmp.Save(Sv.FileName, break; case 3: Tmp.Save(Sv.FileName, break; case 4: Tmp.Save(Sv.FileName, break; } Ref.Dispose(); // Cierro el formularioImageFormat.Png);ImageFormat.Gif);ImageFormat.Bmp);} } else { MessageBox.Show("Al menos debe selecionar una opcin","xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch { MessageBox.Show("Introduzca valores vlidos", "xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } void Cancelar_Click(object sender, EventArgs e) { Ref.Dispose(); // Cierro el formulario }/// /// Escala la imagen capturada al % especificado/// /// Imagen que se quiere escalar /// Porcentaje de reduccin /// Imagen escalada public Image Resize(Image foto,int TantoPorCiento) { float Tporciento=((float)TantoPorCiento/100); // Obtengo el coeficiente de dimension int ImgOrAncho=foto.Width; int ImgOrAlto=foto.Height; // Obtengo las dimensiones originales de la foto int OrigX=0; int OrigY=0; int ResX=0; // Variables referencia para saber donde empiezo a contar px int ResY=0;int ResAncho=(int)(ImgOrAncho*Tporciento); int ResAlto = (int)(ImgOrAlto * Tporciento); // Obtengo las dimensiones al % especificado Bitmap RszIm= new Bitmap(ResAncho,ResAlto,PixelFormat.Format24bppRgb); // Creo una imagen con esas dimensiones y bpp RszIm.SetResolution(foto.HorizontalResolution,foto.VerticalRe solution); // Le doy la misma res. que la original Graphics Gfoto= Graphics.FromImage(RszIm); // Creo una intancia de Graphics para manejar la imagen nueva Gfoto.InterpolationMode= InterpolationMode.HighQualityBicubic; // Especifico la calidad del algoritmo de sampleo // De la foto original, obtengo la redimensionada (mediante un rectngulo) Gfoto.DrawImage(foto,new Rectangle(ResX,ResY,ResAncho,ResAlto),new Rectangle(OrigX,OrigY,ImgOrAncho,ImgOrAlto),GraphicsUnit.Pixel); Gfoto.Dispose(); // Ya no me hace falta esto, asi que lo descargo return(RszIm); // Devuelvo la imagen redimensionada } /// /// Redimensiona la imagen en pixeles /// /// Imagen a redimensionar /// Ancho de la imagen /// Alto de la imagen /// Imagen redimensionada public Image Resize(Image foto, int ancho, int alto) { int ImgORAncho = foto.Width; int ImgOrAlto = foto.Height; // Obtengo las int OrigX = 0; int OrigY = 0;dimensiones de la fotoint ResX = 0; contar px int ResY = 0;// Varables referencia para saber dondefloat Porciento = 0; float PorcientoAncho = 0; // Porcentajes de sampleo float PorcientoAlto = 0; PorcientoAncho = ((float)ancho / (float)ImgORAncho); PorcientoAlto = ((float)alto / (float)ImgOrAlto); //Calculo el % que puedo resamplear if (PorcientoAlto < PorcientoAncho){ Porciento = PorcientoAlto; } else { // Para resamplear bien Porciento = PorcientoAncho; } int AnchuraFinal = (int)(ImgORAncho * Porciento); int AlturaFinal; // Calculo las nuevas dimensiones if (ancho >alto) { AlturaFinal = (int)(ImgOrAltoPorciento); } proporcionar la imagen*else { AlturaFinal =AnchuraFinal;} // Para Bitmap RszIm = new Bitmap(ancho, alto,PixelFormat.Format24bppRgb); RszIm.SetResolution(foto.HorizontalResolution,foto.VerticalReso lution); Graphics Gfoto = Graphics.FromImage(RszIm); Gfoto.InterpolationMode =InterpolationMode.HighQualityBicubic; Gfoto.DrawImage(foto,new Rectangle(ResX, ResY, AnchuraFinal, AlturaFinal),new Rectangle(OrigX, OrigY, ImgORAncho , ImgOrAlto),GraphicsUnit.Pixel); Gfoto.Dispose(); return (RszIm); } } /// Clase que guarda las imgenes #region Funciones API [DllImport("user32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, intlParam);[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")] public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID); [DllImport("user32.dll", EntryPoint = "EmptyClipboard")] public static extern int EmptyClipboard();[DllImport ("avicap32.dll",EntryPoint="capGetDriverDescriptionA")] public static extern bool capGetDriverDescriptionA(int wdriver,string lpszName,int cbName,string lpszVer,int cbVer); #endregion #region Constantes API const const const const const const const const int int int int int int int int WM_USER = 1024; WM_CAP_CONNECT = 1034; WM_CAP_DISCONNECT = 1035; WM_CAP_GET_FRAME = 1084; // Constantes necesarias WM_CAP_COPY = 1054; WM_CAP_START = WM_USER; WM_CAP_SET_PREVIEW = WM_CAP_START + 50; WM_CAP_SET_PREVIEWRATE = WM_USER + 52;#endregion private int Frecuencia=0; // Frecuencia de captura de imagen private int CamHandle=0; // Handle del dispositivo Timer reloj; // Timer ComboBox Cbx; // Para referencia al Combobox PictureBox Pbx; // Para referencia al Picturebox /// /// Crea una instancia de la clase WebCam de Emperorxdevil /// /// Intervalo de tiempo en el que se capturarn las imgenes /// PictureBox en el cual se mostrar lo capturado por la webcam /// Listbox en el que se mostrarn las Cams detectadas public WebCam(int frecuencia,PictureBox pct, ComboBox cb) { Frecuencia=frecuencia; Pbx=pct; // Inicio las variables necesarias reloj= new Timer(); // Creo el timer reloj.Tick += new EventHandler(reloj_Tick); // Le asigno el controlador reloj.Interval=Frecuencia; // Asigno la velocidad de captura Cbx= cb; //Configuro la referencia } private void reloj_Tick(object sender, EventArgs e) { SendMessage(CamHandle, WM_CAP_GET_FRAME,0,0); // Capturo la imagen SendMessage(CamHandle, WM_CAP_COPY, 0, 0); // La copio al portapeles Pbx.Image=Clipboard.GetImage(); // La mando al Picturebox EmptyClipboard(); // Vaco el portapapeles} /// /// Listar las cmaras web encontradas en el Combobox asociado /// public void Listar() { bool valor; string nombre; string version; int x=0; do { nombre="Dispositivo"+x.ToString(); valor=capGetDriverDescriptionA(x,nombre,100,"v1",100); if (valor) Cbx.Items.Add(nombre); x=x+1; } while (!valor==false); } /// /// La WebCam se Encender y mostrar lo capturado en el PictureBox referenciado /// /// N de dispositivo del Combobox public void Capturar(int Dispositivo) { try { StopCaptura(); // Antes de nada "reseteo" el dispositivo CamHandle= capCreateCaptureWindowA("XdevilCapture"+Dispositivo.ToString(),0,0,0,0,0,Pbx.Handl e.ToInt32(),Dispositivo); // Obtengo el Handle de la cam SendMessage(CamHandle, WM_CAP_CONNECT, 0, 0); // Enciendo la cam SendMessage(CamHandle,WM_CAP_SET_PREVIEWRATE,30,0); // Establezco los frames de captura /seg SendMessage(CamHandle, WM_CAP_SET_PREVIEW,0,0); // Empiezo a capturar reloj.Start(); // Inicio la captura } catch (Exception e) { MessageBox.Show("No se puede Iniciar la } } /// /// Detiene la captura de imgenes y apaga la WebCam /// public void StopCaptura() { try { reloj.Stop(); // Paro el reloj que capturaWebCam","Error");SendMessage(CamHandle, WM_CAP_DISCONNECT, 0, 0); // Apago la cam } EmptyClipboard(); // Vaco el portapapelescatch (Exception e) { } // No hago nada.. pa k ? } /// /// Muestra diferentes parametros configurables de la imagen que se va a /// public void GuardarImagen() { SaveImage s= new SaveImage(Pbx.Image,true); // Creo la clase que guarda las fotos } }guardar