Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2006
ilichhernandez ilichhernandez is offline
Miembro
 
Registrado: oct 2005
Posts: 277
Poder: 19
ilichhernandez Va por buen camino
Unhappy 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.
__________________
[Lo que a veces es tan facil, a veces parece imposible]
Responder Con Cita
  #2  
Antiguo 30-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Código Delphi [-]
...Canvas.Pixels[x,y]    // devuelve el color de ese pixel.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 30-10-2006
juanchi juanchi is offline
Miembro
 
Registrado: sep 2003
Posts: 56
Poder: 21
juanchi Va por buen camino
Smile

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
Responder Con Cita
  #4  
Antiguo 30-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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;

Última edición por seoane fecha: 30-10-2006 a las 15:04:10.
Responder Con Cita
  #5  
Antiguo 30-10-2006
ilichhernandez ilichhernandez is offline
Miembro
 
Registrado: oct 2005
Posts: 277
Poder: 19
ilichhernandez Va por buen camino
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.
__________________
[Lo que a veces es tan facil, a veces parece imposible]
Responder Con Cita
  #6  
Antiguo 30-10-2006
juanchi juanchi is offline
Miembro
 
Registrado: sep 2003
Posts: 56
Poder: 21
juanchi Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 31-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
¿Puedes poner un poco de codigo?
Responder Con Cita
  #8  
Antiguo 31-10-2006
juanchi juanchi is offline
Miembro
 
Registrado: sep 2003
Posts: 56
Poder: 21
juanchi Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 31-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 02-11-2006
juanchi juanchi is offline
Miembro
 
Registrado: sep 2003
Posts: 56
Poder: 21
juanchi Va por buen camino
Smile

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.
Responder Con Cita
  #11  
Antiguo 02-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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;
Responder Con Cita
  #12  
Antiguo 02-11-2006
juanchi juanchi is offline
Miembro
 
Registrado: sep 2003
Posts: 56
Poder: 21
juanchi Va por buen camino
Muchas gracias seoane. Te cuento que si logré realizar el histograma. Probaré tu consejo y te contaré que tal me fué.


Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como hago un pixel transparente jorge1987 Gráficos 7 26-09-2006 20:19:28
pasar imagen pixel a pixel gulder Gráficos 7 26-06-2005 02:10:45
Como asignarle atributos a un pixel? bustio .NET 0 03-12-2004 20:42:00
Obtener posicion X,Y de un pixel en un TImage diegofhernando Varios 3 17-12-2003 15:03:23
¿ Cual es la mejor forma de implementar una Pizarra con Sockets? pixel a pixel ? sase Internet 1 22-10-2003 16:23:50


La franja horaria es GMT +2. Ahora son las 03:41:52.


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
Copyright 1996-2007 Club Delphi