http://foros.solocodigo.com/index.php?showtopic=30381 public class WebCam
{
// Conserva esta cabecera // Empeorxdevil 2007 class SaveImage { // Conserva esta cabecera // Emperorxdevil 2007
Asociado
/// <summary> /// Imagen que contiene la clase /// public Image Tmp; // referencia a la imagen del Picturebox Form Ref; // referencia que necesitare a este formulario
di�logo
Form Opciones; GroupBox Gr; RadioButton R1; RadioButton R2; RadioButton R3; TextBox Porciento; TextBox Larg;
// Objetos necesarios para formar el
TextBox Anch; Label L1; Label L2; Button Acepta; Button Cancelar; SaveFileDialog Sv; DialogResult rs; /// <summary> /// Constructor de clase SaveImage /// /// <param name="imagen">Imagen que se va a guardar /// <param name="Interfaz"> 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="Par�metros de Imagen"; Opciones.ControlBox=false; Opciones.ShowInTaskbar=false; Opciones.FormBorderStyle=FormBorderStyle.FixedDialog; Gr= new GroupBox(); Gr.Width=288; Gr.Height=105; Gr.Text="Configuraci�n";
Gr.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 tama�o 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 tama�o 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;
Opciones.ShowDialog(); } /// <summary> /// Constructor de la clase SaveImage sin Interfaz /// /// <param name="imagen">Imagen a Guardar public SaveImage(Image imagen) { Tmp = imagen; // Asigno la imagen... } void R3_CheckedChanged(object sender, EventArgs e)
{
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)); }
Sv= new SaveFileDialog(); // Creo un di�logo
para salvar la imagen
Sv.Title = "Guardar imagen como..."; // Lo
configuro
Sv.Filter = "Archivo JPG|*.jpg|Archivo PNG| *.png|Archivo GIF|*.gif|Mapa de Bits|*.bmp"; rs = Sv.ShowDialog(); // Lo muestro modal if (rs == DialogResult.OK) { int x = Sv.FilterIndex; // Ontengo la
extensi�n seleccionada
switch (x) { // Salvo la imagen en el formato deseado case 1: Tmp.Save(Sv.FileName, ImageFormat.Jpeg);
break; case 2: Tmp.Save(Sv.FileName,
ImageFormat.Png);
break; case 3: Tmp.Save(Sv.FileName,
ImageFormat.Gif);
break; case 4: Tmp.Save(Sv.FileName,
ImageFormat.Bmp);
break; }
Ref.Dispose(); // Cierro el formulario
} } else { MessageBox.Show("Al menos debe selecionar una opci�n","xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch { MessageBox.Show("Introduzca valores v�lidos", "xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } void Cancelar_Click(object sender, EventArgs e) { Ref.Dispose(); // Cierro el formulario }
/// <summary> /// Escala la imagen capturada al % especificado
/// /// <param name="foto"> Imagen que se quiere escalar /// <param name="TantoPorCiento"> Porcentaje de reducci�n /// 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 rect�ngulo) 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 } /// <summary> /// Redimensiona la imagen en pixeles /// /// <param name="foto"> Imagen a redimensionar /// <param name="ancho">Ancho de la imagen /// <param name="alto">Alto de la imagen /// Imagen redimensionada public Image Resize(Image foto, int ancho, int alto) {
dimensiones de la foto
int ImgORAncho = foto.Width; int ImgOrAlto = foto.Height; // Obtengo las int OrigX = 0; int OrigY = 0;
int ResX = 0; contar px
// Varables referencia para saber donde
int ResY = 0; float 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)(ImgOrAlto
Porciento); }
*
else { AlturaFinal =AnchuraFinal;} // Para proporcionar la imagen 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 im�genes #region Funciones API
lParam);
[DllImport("user32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int
[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 /// <summary> /// Crea una instancia de la clase WebCam de Emperorxdevil /// /// <param name="frecuencia">Intervalo de tiempo en el que se capturar�n las im�genes /// <param name="pct">PictureBox en el cual se mostrar� lo capturado por la webcam /// <param name="cb"> Listbox en el que se mostrar�n 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(); // Vac�o el portapapeles
} /// <summary> /// Listar� las c�maras 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); } /// <summary> /// La WebCam se Encender� y mostrar� lo capturado en el PictureBox referenciado /// /// <param name="Dispositivo">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 }
WebCam","Error");
catch (Exception e) { MessageBox.Show("No se puede Iniciar la }
} /// <summary> /// Detiene la captura de im�genes y apaga la WebCam /// public void StopCaptura() { try { reloj.Stop(); // Paro el reloj que captura
SendMessage(CamHandle, WM_CAP_DISCONNECT, 0, 0); // Apago la cam }
EmptyClipboard(); // Vac�o el portapapeles
catch (Exception e) { } // No hago nada.. pa k ?
guardar
} /// <summary> /// 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 } }