PDA

Ver la Versión Completa : Un pixel en Timage


Cecilio
16-02-2009, 14:23:02
Hola.

Estoy intentando obtener el código de color de un pixel en una imagen cargada con Timage.

La idea que tengo es guardar x pixeles por cada imagen para saber si se ha suplantado la imagen y tambier para buscar repeticiones en una carpeta.

He visto que el pixel se lee así:

var i: Tcolor;
i:= Image1.Picture.Bitmap.Canvas.Pixels[10,10];


¿ pero como se maneja Tcolor ?

Los pos que he encontrado no me han aclarado mucho.

Gracias.

Crandel
16-02-2009, 14:52:58
TColor esta definido como numeros enteros de 4 bytes.

Por lo que puedes usarlo como cualquier valor entero, asignarle valores en ese rango, comparar, etc.

Supongamos que tienes una imagen en cada TImage, puedes hacer:


var
color1, color2: Tcolor;
begin
color1 := Image1.Picture.Bitmap.Canvas.Pixels[10,10];
color2 := Image2.Picture.Bitmap.Canvas.Pixels[10,10];
if color1 = color2 then
...
end;

Cecilio
16-02-2009, 15:54:39
Muchas gracias por la aclaración.

Pensaba que podría llevar los componentes separados rgb, brillo y otros datos.

El rgb va compatado, y poco más.

Delphius
16-02-2009, 17:38:38
La otra opción es emplear el método Scanline(). Con éste método se consigue un acceso más rápido que con Pixels[]. El problema es que requiere un poquito más de código.

Cuando llamas a ScanLine() debes indicar la "fila" sobre la cual deseas evaluar.
Luego, debes posicionarte sobre la "columna" de dicha fila.
ScanLine() regresa la dirección de memoria donde comienza la j-ésima fila, por lo que se necesita un puntero para almacenar el valor, luego es posible moverse de a 3 posiciones y de este modo conseguir ir pixel a pixel.

Básicamente lo que se hace es posicionarse en el pixel [i,j] en dos pasos:
1. Ir a la fila j-ésima.
2. Interar i veces, 3 lugares sobre la fila j-ésima.

Lo bueno de este método es que se consigue leer los valores RGB de un pixel, y te evitas tener que estar realizando conversión de TColor a RGB.

Si buscas sobre ScanLine encontrarás hilos con ejemplos de uso;).

OJO: esto aplica a bitmaps.

Saludos,

Cecilio
16-02-2009, 19:10:00
Delphius Muy interesante, no lo sabía, lo usaré en otras ocasiones.

Para este caso usaré los pixel ya que no van aser más de 5 repartidos por la imagen.

pero se agradece la idea.