Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Un pixel en Timage (https://www.clubdelphi.com/foros/showthread.php?t=63474)

Cecilio 16-02-2009 14:23:02

Un pixel en Timage
 
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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 23:12:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi