captura imagen c#
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