elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  problema con imagecolorat
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con imagecolorat  (Leído 1,890 veces)
N4X

Desconectado Desconectado

Mensajes: 74



Ver Perfil WWW
problema con imagecolorat
« en: 3 Enero 2010, 22:41 pm »

Buenas, resulta que estoy trabajando en un script de reconocimiento de captchas y me sucede un problema un tanto singular

Este es el captcha ejemplo:



y esta una letra aislada por el script, con la previa funciona Limpiar() aplicada


remarco lo de la función Limpiar() aplicada porque como veis, lo que hace es eliminar el fondo y trabajar con 2 colores, blanco y negro.
de esa función resalto esto:

Código
  1. //Recorremos cada pixel
  2. for ($x = 0; $x < $w; $x++) {
  3. for ($y = 0; $y < $h; $y++) {
  4.  
  5. //asignamos los valores numéricos a los canales RGB
  6. $rgb = imagecolorat($imagen, $x, $y);
  7. $r = ($rgb >> 16) & 255;
  8. $g = ($rgb >> 8) & 255;
  9. $b = $rgb & 255;
  10.  
  11. if ($r > 220 && $g < 200 && $b < 200) {
  12. $f = imagecolorresolve($newimg, 0, 0, 0);
  13. imagesetpixel($newimg, $x, $y, $f); //Pintamos negro si es una letra roja
  14. } else {
  15. $f = imagecolorresolve($newimg, 255, 255, 255);
  16. imagesetpixel($newimg, $x, $y, $f); //Sino pintamos blanco
  17. }
  18. }
  19. } //End for


sobre todo el tema $rgb con la función imagecolorat. en este caso funciona perfectamente.

después de aislar la imagen, la idea es crear un registro de cada pixel y el color que contiene (blanco o negro) entonces para ello uso otra funcion createdatamap()

Código
  1. for ($x = 0; $x < $w; $x++) {
  2. for ($y = 0; $y < $h; $y++) {
  3.  
  4. $rgb = imagecolorat($imagen, $x, $y);
  5. $r = ($rgb >> 16) & 255;
  6. $g = ($rgb >> 8) & 255;
  7. $b = $rgb && 255;
  8.  
  9. if ($r < 220)
  10. $color = 1;
  11. else
  12. $color = 0;
  13.  
  14. //creamos el datamap
  15. $datamap .=":".$x.",".$y.",".$color;
  16. }

ahora... el problema está en el $rgb....
a diferencia del caso anterior me reconoce todo como 0 ($color = 0) y nunca como 1. es decir nunca encuentra negro y siempre blanco...
le di muchas vueltas a las imagenes prové de crear el datamap sin separar las imagenes.. enfin un monton de cosas...

al final empezé a dumpear las variables y encntré que el $rgb es 0... es decir no toma valor... porqué? no lo se... en la función anterior el $rgb si toma valor al querer limpiar el fondo, pero en este no..

aunque yo los vea igual..

en los 2 casos $w y $h se sacan de aqui:

Código
  1. $w = imagesx($imagen);
  2. $h = imagesy($imagen);

y $imagen en la primera función es la imagen del captcha y en la 2nda es el carcter limpio

saludos y gracias
nax


En línea

luiggy2


Desconectado Desconectado

Mensajes: 439


¡ Hello word ! XD


Ver Perfil
Re: problema con imagecolorat
« Respuesta #1 en: 4 Enero 2010, 18:45 pm »

Te lo voy a plantear desde 0:

En vez de primero limpiar el fondo y los colores, recorta cada letra por separado.
una vez que tengas cada letra en un archivo, limpia el fondo verde (en este caso), y el azul lo conviertes a rojo.

De esta forma, trendrás la letra aislada.

Saludos!


Posdata. Si puedes poner más ejemplos del captcha te puedo ayudar un poco más, porque no se si cambian los colores de las lettras, del fondo, de las lineas, las posiciones de estas, ....




Una última duda: ¿Lo estás haciendo siguiendo el manual que hay por ahí? (esuqe me suena mucho este código)


En línea

" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "
N4X

Desconectado Desconectado

Mensajes: 74



Ver Perfil WWW
Re: problema con imagecolorat
« Respuesta #2 en: 4 Enero 2010, 21:42 pm »

no los separé al principio porque no tomaba bien los colores...

ahora... el tema de la linea azul me puede llegar a obligar a tener que replantear el código  :-X

el captcha no cambia, el único cambio es que aveces hay 6 letras y aveces 5...

El problema lo solucioné tomando el valor de $rgb, ya que era 1 o 0, y con eso salí del apaño

gracias :D

mi problema ahora es un tanto mas complicado, ya que si creo con un code el captcha y lo guardo, luego cargo la imagen en el mismo script (o uso la variable que creo el captcha) me limpia mal el fondo (directamente lo borra todo -.-)

sin embargo si lo pego en el paint lo guardo y lo cargo via script lo hace bien  :rolleyes: :rolleyes: :rolleyes:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines