Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   quitar el color naranja en una imagen (https://www.clubdelphi.com/foros/showthread.php?t=56172)

kurono 09-05-2008 08:03:38

quitar el color naranja en una imagen
 
hola amigos como puedo modificar este codigo que me quita el color rojo en una imagem para que me quite el color naranja

Código Delphi [-]
uses jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var
 jpg: TJPEGImage;
 bmp: TBitmap;
 Count: Cardinal;
 lpBuffer: PByte;
begin
 jpg := TJPEGImage.Create;
 jpg.LoadFromFile('c:\windows\web\wallpaper\autumn.jpg');
 bmp := TBitmap.Create;
 bmp.Assign(jpg);
 bmp.PixelFormat := pf24bit;
 Count := bmp.Width * bmp.Height;
 lpBuffer := PByte(Cardinal(bmp.ScanLine[bmp.Height - 1]) + 2);
 while LongBool(Count) do // Barrido
  begin
   if lpBuffer^ > 64 then //  Si el tono excede el mínimo
    Dec(lpBuffer^, 64);   // reducimos dicho valor.
//    lpBuffer^ := 255{Ej. enrojecido total};
   Inc(lpBuffer, 3);
   Dec(Count);
  end;
 Image2.Picture.Assign(bmp);
 Image1.Picture.Assign(jpg);
 bmp.Destroy;
 jpg.Destroy;
end;
end.

cHackAll 09-05-2008 13:52:16

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 jpg: TJPEGImage;
 bmp: TBitmap;
 Count: Cardinal;
 lpBuffer: PChar;
begin
 jpg := TJPEGImage.Create;
 jpg.LoadFromFile('c:\windows\web\wallpaper\autorun.jpg');
 bmp := TBitmap.Create;
 bmp.Assign(jpg);
 bmp.PixelFormat := pf24bit;
 Count := bmp.Width * bmp.Height;
 lpBuffer := PChar(Cardinal(bmp.ScanLine[bmp.Height - 1]) + 1);
 while LongBool(Count) do
  begin
   if (lpBuffer^ > #32) and (lpBuffer[1] > #32) then
    begin
     Dec(lpBuffer[1], 32);
     Dec(lpBuffer^, 32);
    end;
   Inc(lpBuffer, 3);
   Dec(Count);
  end;
 Image2.Picture.Assign(bmp);
 Image1.Picture.Assign(jpg);
 bmp.Destroy;
 jpg.Destroy;
end;

Edito; había dejado una ruta muy particular como nombre de archivo, y no se aplicaba al caso.

Delphius 09-05-2008 16:15:04

Hola kurono,
Al final del código llamas a Destroy. No es aconsejable llamar a Destroy explícitamente, lo correcto es emplear Free para liberar el objeto. O en su defecto, FreeAndNil.

Saludos,

cHackAll 09-05-2008 16:36:35

Cita:

Empezado por Delphius (Mensaje 285548)
Hola kurono,
Al final del código llamas a Destroy. No es aconsejable llamar a Destroy explícitamente, lo correcto es emplear Free para liberar el objeto. O en su defecto, FreeAndNil.

Saludos,

Mea culpa :o lo que dice Delphius es cierto, sin embargo el método Free no es virtual, lo que significa que dificilmente sea sobreescrito por una clase heredada de TObject, con un codigo tan simplon como;

Código Delphi [-]
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

Me he mal acostumbrado a saltarme ese paso (para mi) innecesario; he ir directo a destruir el objeto :o

Saludos

kurono 09-05-2008 19:42:08

amigo hackll con esa modificacion del codigo el color anaranjado no llega a quitarse ni disminuye tampoco lo que hace es distorcionar la imgen lo que quiero no es quitar del todo el color naranja de la imagen sino disminuirla lo mas posible o poner la imagen en blanco y negro y ir subiendo el color poco a poco en cuanto al amigo delpius aplique lo que me dices sobre el codigo free

cHackAll 12-05-2008 16:13:04

Cita:

Empezado por kurono (Mensaje 285639)
amigo hackll con esa modificacion del codigo el color anaranjado no llega a quitarse ni disminuye tampoco lo que hace es distorcionar la imgen lo que quiero no es quitar del todo el color naranja de la imagen sino disminuirla lo mas posible o poner la imagen en blanco y negro y ir subiendo el color poco a poco en cuanto al amigo delpius aplique lo que me dices sobre el codigo free

Amigo kurono, procura utilizar el Clipboard para copiar mi nick; no te gustaría que a ti te dijeran "korona" verdad?, (lo digo tambien por el nick de Delphius). Tampoco comprendo lo que quisiste decir al final; te ruego tomar unos segundos más para redactar tus ideas.


Ahora distorcionar? no... hace lo que dijiste; talvez haya un error mínimo;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 jpg: TJPEGImage;
 bmp: TBitmap;
 Count: Cardinal;
 lpBuffer: PChar;
begin
 jpg := TJPEGImage.Create;
 jpg.LoadFromFile('c:\windows\web\wallpaper\Autumn.jpg');
 bmp := TBitmap.Create;
 bmp.Assign(jpg);
 bmp.PixelFormat := pf24bit;
 Count := bmp.Width * bmp.Height;
 lpBuffer := PChar(Cardinal(bmp.ScanLine[bmp.Height - 1]) + 1);
 while LongBool(Count) do
  begin
   if (lpBuffer^ > #32) and (lpBuffer[1] > #64) then
    begin
     Dec(lpBuffer[1], 64);
     Dec(lpBuffer^, 32);
    end;
   Inc(lpBuffer, 3);
   Dec(Count);
  end;
 Image2.Picture.Assign(bmp);
 Image1.Picture.Assign(jpg);
 bmp.Destroy;
 jpg.Destroy;
end;

El color naranja es una composición de matizes 100% de rojo y 50% de verde, con lo que un naranja puro es $0080FF (255 de rojo, 128 de verde y 0 de azul). Talvez con lo que tengas que trabajar es justamente eso; detectar el valor de dichas matices.

Saludos

kurono 12-05-2008 23:38:48

ok entonces lo que hare es bajar el color rojo y verde luego le cuento como me resulto

Delphius 13-05-2008 03:10:10

Hola kurono,
¿Me podrías explicar mejor que es lo que deseas?
No termino de comprenderte... ¿Deseas quitar todo tono naranja? Si es así... ¿que color debe asumir? ¿el blanco?

La verdad es que me mareó lo que dijiste sobre que esté en blanco y negro y luego darle color...

¿Al final? ¿De que se trata? ¿Dar color a la imagen o quitarlo?:rolleyes::confused:

Para quitarlo es como dice Javier (cHackAll), azul debe ser 0, rojo estar al máximo y el verde a la mitad.

Entonces tu comprobación debería ser:
if (Azul = 0) AND (Rojo = 255) AND (Verde <= 128)
then CambiarColor;

Pero el problema está en saber donde termina el tono rojo y comienza el naranja. El rojo puro es (255,0,0) el naranja puro es (255,128,0) y el medio hay muchos tonos, la mitad son más anaranjados y la otra mitad son rojizos. Por ejemplo el valor (255,64,0) No es ni naraja ni rojo.
El asunto es ¿Cuando consideras que es tono naranja?:confused:

Y mira... prueba con este color (255,192,0) Se ve que tiene tendencia al amarillo... prueba con este: (255,160,0) ¿Que es? Tiene de naranja y tiene de amarillo. El (255,144,0) También tiene de naranja... pero tiene de amarillo... ¿El (255,136,0) te sigue pareciendo con un tono naranja?;)

¿Entiendes más o menos a lo que voy?
Tonos naranjas hay muchos. El naranja está entre el rojo y el amarillo. Pero hay valores que nos pueden confundir...

No se quienes emplearán tu sistema, ni para que es esta funcionalidad. Si debo advertirte que la sencación de tonalidad que percibimos no es fija, y cada persona percibe más o menos ciertas tonalidades... ni que decir si la persona sufre daltonismo. ¡Justo el color que trae problemas! Hace un tiempo en la taberna se hablo un poquito del tema y allí una de nuestras compañeras expuso este enlace.

Me gustaría que me explicaras cual es el objetivo de eliminar justo este problemático color.

No se si todo lo que te he dicho te sea de utilidad. Pero es que justo este tema no es tan sencillo como parece. Me pareció oportuno acerte tomar conocimiento de esto.

Saludos a todos colores, diría nuestro amigo Al.:D

kurono 13-05-2008 03:19:50

gracias amigo delphius y chackall pues pude disminuir el color naranja con los ejemplo que me dieron ustedes y estan muy buenos tanto lo de chackall como los de delphius pues lo estoy implementando en el programa que estoy haciendo pues como dice delphius hay que saber el valor exacto de donde comiensa cada color de parto yo convinando valores hasta llegar al que deseo muchas gracias nuevamente a los dos

Delphius 13-05-2008 03:28:56

Cita:

Empezado por kurono (Mensaje 286214)
gracias amigo delphius y chackall pues pude disminuir el color naranja con los ejemplo que me dieron ustedes y estan muy buenos tanto lo de chackall como los de delphius pues lo estoy implementando en el programa que estoy haciendo pues como dice delphius hay que saber el valor exacto de donde comiensa cada color de parto yo convinando valores hasta llegar al que deseo muchas gracias nuevamente a los dos

Me alegro que hayas captado la idea.
Sino es mucha molestia, ¿podrías para la proxima usar mejor los signos de puntuación?
No es que sea muy quisquilloso... es que escribir todo seguido dificulta un poco más la lectura.
No te estoy retando, sólo es una pequeña observación. No te pido que escribas a lo Neruda.

Muchas gracias,
Saludos,

kurono 13-05-2008 03:30:34

ok no hay problema


La franja horaria es GMT +2. Ahora son las 08:01:24.

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