Ver Mensaje Individual
  #4  
Antiguo 09-01-2005
<Sergio> <Sergio> is offline
Miembro
 
Registrado: sep 2004
Posts: 72
Reputación: 21
<Sergio> Va por buen camino
Cita:
Empezado por bustio
creo una variable tipo Bitmap y luego le asigno la imagen leida desde el fichero que deseo analizar.
Luego, cuento los pixeles por filas y columnas y luego con un ciclo voy visitando pixel a pixel, y en ese momento y para el pixel(x,y) obtengo sus respectivos valores en la escala RGB
¿No estarás accediendo a la imagen con el pixels[], verdad?

P.D.

Si lo estás haciendo es mejor que utilices el scanline (muchísimo más rápido por varios motivos...), te devuelve una referencia a memoria al inicio de la linea "y".

Define un tipo de dato de acuerdo al tipo de formato de pixel, ej: arreglo de bytes para 24 bits: en bytes: 3*ancho de la imagen.

TLinea=array[0..64535] of byte;//el 64535 solo para el control de rangos del compilador, puede ser 0..0 si no controla rangos.
PLinea=^Tlinea;

Defines una variable del tipo PLinea y le asignas el valor que devuelve
bitmap.scanline(y) suponiendo que tienes un objeto bitmap:Tbitmap

Mucho cuidado de pasarse del ancho total en bytes de cada linea de tu imagen.

Otra forma es usar directamente la referencia a memoria, guardarla en un entero de 4 bytes mientero=integer(bitmap.scanline(y)), hacer un ciclo while e incrementar la posición de memoria a revisar y cuando sea necesario aclararle al compilador que quieres usar tu entero como referencia a memoria: mivalor:=byte(pointer(mientero)^), esto genera código más eficiente.

El pixels[x,y] está pensado para acceder a cualquier pixel de la imagen al azar: realiza control de rangos, llama al scanline por cada pixel y además que realiza conversión de color al formato utilizado por Tcolor. Llamar al scanline para cada pixel es bastante pesado comparado a llamarlo sólo para cada línea.

Última edición por <Sergio> fecha: 09-01-2005 a las 17:04:21.
Responder Con Cita