Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/01/2010, 19:38
N4X
 
Fecha de Ingreso: enero-2010
Mensajes: 23
Antigüedad: 14 años, 4 meses
Puntos: 0
problema con imagecolorat

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:

[code=php] //Recorremos cada pixel
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {

//asignamos los valores numéricos a los canales RGB
$rgb = imagecolorat($imagen, $x, $y);
$r = ($rgb >> 16) & 255;
$g = ($rgb >> 8) & 255;
$b = $rgb & 255;

if ($r > 220 && $g < 200 && $b < 200) {
$f = imagecolorresolve($newimg, 0, 0, 0);
imagesetpixel($newimg, $x, $y, $f); //Pintamos negro si es una letra roja
} else {
$f = imagecolorresolve($newimg, 255, 255, 255);
imagesetpixel($newimg, $x, $y, $f); //Sino pintamos blanco
}
}
} //End for[/code]


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()

[code=php] for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {

$rgb = imagecolorat($imagen, $x, $y);
$r = ($rgb >> 16) & 255;
$g = ($rgb >> 8) & 255;
$b = $rgb && 255;

if ($r < 220)
$color = 1;
else
$color = 0;

//creamos el datamap
$datamap .=":".$x.",".$y.",".$color;
}[/code]

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:

[code=php] $w = imagesx($imagen);
$h = imagesy($imagen);[/code]

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

saludos y gracias
nax