SoloCodigo
Programación General => Java => Mensaje iniciado por: ditrosi en Martes 5 de Mayo de 2009, 18:30
-
tengo un problema estoy creando un programa con una base de datos donde se guardan los datos de un usuario... el programa ya esta hecho 100% con reconocimiento biometrico y toma fotos desde una webcam...
AYUDA POR FAVOR...
pero tengo un problema y es que no falta el cliente que coloca la super cámara digital como web cam para tomar una foto y me están subiendo fotos de mas de 3MB en la base de datos y la están saturando... luego dicen que es que el programa no sirve que porque es muy lento... en fin mi duda esta en que si alguien sabe de una manera de restringir el tamaño y la resolución con que se toma la foto, es decir que no importe con que tipo de cámara se tome la foto el tamaño max sea de 200Kb y resolución de 150x150 como max...
miren este es el codigo java que tengo para tomar la foto estoy usando la librería javax.media si alguien sabe de una mejor también estoy abierto a nuevas posibilidades
public void Inicializar(){
try {
//El nombre del driver para que pueda ser utilizada cualquier WebCam, que este instalada en el equipo
String dir = "vfw:Microsoft WDM Image Capture (Win32):0";
di = CaptureDeviceManager.getDevice(dir);
ml = new MediaLocator("vfw://0");
video = Manager.createRealizedPlayer(ml);
video.start();
comp = video.getVisualComponent();
if (comp != null) {
ui.ShowWebCam(comp);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public Image tomarFoto(){
// se captura la imagen y se colaca en un buffer
FrameGrabbingControl fgc = (FrameGrabbingControl)
video.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
// se convierte de tipo bufer a tipo Image para poder ser reproducida y almacenada
btoi = new BufferToImage((VideoFormat)buf.getFormat());
img = btoi.createImage(buf);
// Retornamos la foto en una variable tipo Image
return img;
}
-
Hola.
Después de haber visto tu código, lo que yo haría sería capturar la fotografía de forma normal, tal y como lo haces ahora. Pero después de capturar y transformar en Image, usar el método 'Image getScaledInstance(int width, int height, int hints)' de la clase java.awt.Image para bajar la resolución.
Otra opción que tienes, que no sé si sería factible para tu programa es cambiar la compresión y/o el formato de las fotos.
Con ambos métodos, te diría que muestres por pantalla la fotografía 'retocada' que se va a guardar, porque puede que alguien no esté de acuerdo en lo que vas a guardar (frases como 'mi cámara hace mejores fotos que eso' y similares) y se empeñe en repetir la foto 50 veces hasta que le guste el resultado.
Espero que te sirva.
Ya nos contarás.
Silverfox
-
hola silverfox gracias por tu ayuda
la verdad intente hacerlo como decias despues de guardar la foto en una variable tipo image
le di
Image img = img.getScaledInstance(200,150,0);
pero me produce un error al pasar la imagen a un archivo para ser guardada
Hola.
Después de haber visto tu código, lo que yo haría sería capturar la fotografía de forma normal, tal y como lo haces ahora. Pero después de capturar y transformar en Image, usar el método 'Image getScaledInstance(int width, int height, int hints)' de la clase java.awt.Image para bajar la resolución.
Otra opción que tienes, que no sé si sería factible para tu programa es cambiar la compresión y/o el formato de las fotos.
Con ambos métodos, te diría que muestres por pantalla la fotografía 'retocada' que se va a guardar, porque puede que alguien no esté de acuerdo en lo que vas a guardar (frases como 'mi cámara hace mejores fotos que eso' y similares) y se empeñe en repetir la foto 50 veces hasta que le guste el resultado.
Espero que te sirva.
Ya nos contarás.
Silverfox
-
Hola ditrosi.
¿Qué error te da?
Por la linea que estás poniendo, no cogiste del todo cómo se usa el método. El tercer parámetro (hints en la documentación) es para poner allí la constante de cómo quieres que se escale la imágen.
Los candidatos son:
static int SCALE_AREA_AVERAGING
Use the Area Averaging image scaling algorithm.
static int SCALE_DEFAULT
Use the default image-scaling algorithm.
static int SCALE_FAST
Choose an image-scaling algorithm that gives higher priority to scaling speed than smoothness of the scaled image.
static int SCALE_REPLICATE
Use the image scaling algorithm embodied in the ReplicateScaleFilter class.
static int SCALE_SMOOTH
Choose an image-scaling algorithm that gives higher priority to image smoothness than scaling speed.
He mirado en la documentación y ninguno de ellos era 0. Te aconsejo que pruebes con Image img = img.getScaledInstance(200,150, Image.SCALE_SMOOTH); para ver si te sigue fallando. Si lo hace, dinos qué error se produce.
Un saludo.
Silverfox