PDA

Ver la Versión Completa : quitar el color naranja en una imagen


kurono
09-05-2008, 08:03:38
hola amigos como puedo modificar este codigo que me quita el color rojo en una imagem para que me quite el color naranja

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
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
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 (http://www.clubdelphi.com/foros/showthread.php?p=283009) 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;

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
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;

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 (http://www.vischeck.com/daltonize/).

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
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