Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Como obtener el color de un pixel (https://www.clubdelphi.com/foros/showthread.php?t=36972)

ilichhernandez 30-10-2006 14:30:40

Como obtener el color de un pixel
 
Hola estimados, estoy trabajando con canvas, realizo unas rectas en el formulario y debo saber laq posicion de la recta, para eso necesito saber como obtener el color de un pixel expecifico.... asi como coloco un color con canvas.pixels.color := clred yo pense en algo asi como "if canvas.pixels.color = clREd" pero no me funcion a de esa manera..... agradeceria alguna ayuda.


Atentamente
Roberto Hernandez.

Neftali [Germán.Estévez] 30-10-2006 14:34:45

Código Delphi [-]
...Canvas.Pixels[x,y]    // devuelve el color de ese pixel.

juanchi 30-10-2006 14:53:02

Hola a todos.
Yo tengo un problema parecido, ya que tengo una imagen bmp con 256 colores en escala de grises. El problema es que quiero saber que número es un determinado nivel de gris, pero el valor que me arroja es muy grande. ¿Porqué si la imagen tiene 256 colores?, ¿No tendría que ser un valor en este rango?.


Saludos:)

seoane 30-10-2006 15:01:42

Cita:

Empezado por juanchi
¿No tendría que ser un valor en este rango?.

Pues no, la propiedad pixel devuleve el color en formato RGB. Es decir un byte para cada color (Rojo, Verde, Azul). Los colores grises tienen la peculiaridad de tener los tres bytes del mismo valor, lo que nos da un rango de 256 valores posibles, asi el negro es $000000, el blanco $FFFFFF, y un gris intermedio $7F7F7F.

Si quieres un valor entre 0 y 255 siempre puedes tomar el valor de uno solo de los bytes:
Código Delphi [-]
var
  Valor: Integer;
begin
  Valor:= Canvas.Pixels[5,5] and $FF;

ilichhernandez 30-10-2006 23:16:01

Muchas Gracias ya me esta empezando a quedar mas clara la idea....existe alguna manera de calcular la distancia entre dos rectas dibujadas con canvas que sea distinto de revisar pixel por pixel y ver cuando cambia el color del punto. Si alguien sabe que me comente por favor....

Gracias.

juanchi 30-10-2006 23:58:38

Hola.
Ahora tengo otro problema. Lo que pasa es que al recorrer una imagen me da que esta tiene pixeles blancos aunque la imagen original no tenga ninguno. Lo que hice fué pasar la imagen en RGB a 256 colores con la sentencia: imagen1.canvas.pixel[x,y] and $FF.

Salu2.:)

seoane 31-10-2006 00:12:30

Cita:

Empezado por juanchi
Hola.
Ahora tengo otro problema. Lo que pasa es que al recorrer una imagen me da que esta tiene pixeles blancos aunque la imagen original no tenga ninguno. Lo que hice fué pasar la imagen en RGB a 256 colores con la sentencia: imagen1.canvas.pixel[x,y] and $FF.

Salu2.:)

:confused: ¿Puedes poner un poco de codigo?

juanchi 31-10-2006 00:29:19

:eek: El código!!!. Ahí va...

procedure TForm1.BitBtn1Click(Sender: TObject);
var
X, Y, Z, W, MaxValor,TamLinea: Integer;
Color : LongInt;
Histograma : array[0..255] of Integer;
begin


MaxValor := 0;
for Z:=0 to 255 do
begin
Histograma[Z] := 0;
end;

for Y := (image1.Width - image1.Width) to image1.Width do
begin
for X := (image1.Height - image1.Height) to image1.Height do
begin
Color := image1.Canvas.Pixels[X, Y]and $FF; {De RGB a 256 colores}
Histograma[Color] := Histograma[Color]+1;
end;
end;

for Z:=0 to 255 do
begin
if( Histograma[Z] > MaxValor ) then
MaxValor := Histograma[Z];
end;

for Z:=0 to 255 do
begin
TamLinea := ((Histograma[Z] * 312) div MaxValor);
image2.Canvas.MoveTo(18+Z, 326);
image2.Canvas.LineTo(18+Z, 326-TamLinea);
end;


end;


Salu2:D

seoane 31-10-2006 01:10:32

Bien, en tu código el problema es el siguiente (marcado en rojo), al hacer referencia a un pixel que no existe devuelve el color blanco por defecto, por eso te aparecía el color blanco aun cuando la imagen no lo contenía:

Código Delphi [-]
for Y := (image1.Width - image1.Width) to image1.Width -1 do
begin
  for X := (image1.Height - image1.Height) to image1.Height -1 do
  begin

Por otro lado, retoque un poco el código:
Código Delphi [-]
var
  i,j: integer;
  Histograma: array[0..255] of Integer;
  Max: Integer;
begin
  FillChar(Histograma,Sizeof(Histograma),0);
  for i:= 0 to Image1.Picture.Bitmap.Width - 1 do
    for j:= 0 to Image1.Picture.Bitmap.Height - 1 do
      inc(Histograma[Image1.Canvas.Pixels[i,j] and $FF]);

  Max:= 0;
  for i:= 1 to 255 do
    if Histograma[i] > Histograma[Max] then
      Max:= i;

  j:= Image1.Picture.Bitmap.Width * Image1.Picture.Bitmap.Height;
  Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
  for i:= 0 to 255 do
  begin
    Image2.Canvas.MoveTo(i,0);
    Image2.Canvas.LineTo(i,(Image2.Height * Histograma[i]) div Histograma[Max]);
  end;
end;

Pero esto ultimo ya es cuestión de gustos. De todas formas para este tipo de operaciones usar la propiedad Pixels del canvas es poco eficiente. Echale un vistazo a la propiedad Scanline del bitmap, mucho mas apropiada para estos casos.

PD: Usa la etiquetas [delphi][/delphi] para incluir código, de esta manera se podrá leer mucho mejor.

juanchi 02-11-2006 15:06:50

Hola.
Para pasar un pixel a hexa utilizo la sentencia:

Valor:= Canvas.Pixels[5,5] and $FF;

Ahora tengo el valor en hexa, ¿cómo puedo hacer el proceso inverso?


Saludos.:)

seoane 02-11-2006 15:34:31

Cita:

Empezado por juanchi
Hola.
Para pasar un pixel a hexa utilizo la sentencia:

Valor:= Canvas.Pixels[5,5] and $FF;

Ahora tengo el valor en hexa, ¿cómo puedo hacer el proceso inverso?


Saludos.:)

hola juanchi, no comentas si al final conseguiste realizar el histograma, supongo que si. En cuanto a lo que preguntas ahora, vamos por partes. Cuando dices que tienes su valor en hexa ¿a que te refieres?, la instrucción que mencionas solamente sirve para seleccionar el byte mas bajo del color, pero no cambia la naturaleza de la variable que en ambos casos es un integer.

Si lo que quieres es volver a recuperar el color gris correspondiente a ese valor solo tenemos que añadir los otros dos bytes, pero como sabemos que en el caso de los grises los tres bytes son iguales esta operación es sencilla:

Código Delphi [-]
var
  Color: TColor;
begin
  // Se puede hacer asi
  Color:= RGB(Valor,Valor,Valor);
  // e incluso asi
  Color:= (Valor shl 16) + (Valor shl 8) + Valor;
end;

juanchi 02-11-2006 15:40:00

Muchas gracias seoane. Te cuento que si logré realizar el histograma. Probaré tu consejo y te contaré que tal me fué.


Saludos.:)


La franja horaria es GMT +2. Ahora son las 15:08:35.

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