Foros Club Delphi

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

kurono 25-04-2008 05:12:00

como quitar el color rojo de una imagen
 
hola amigos tengo un problema quiero hacer una aplicacion donde le quite lo rojiso a una imagen pues le cuento que tengo unas fotos que me salieron con un tono rosjiso y me gustaria quitarlas como lo puedo hacer

kuan-yiu 25-04-2008 09:07:47

Yo creo cualquier programa de retoque digital, hasta el más cutre lo hará mucho mejor de lo que puedas programar tú... salvo que quieras perder horas de tu tiempo en hacer algo que otros ya han perfeccionado por investigar el tema, o sea un ejercicio para algo no le veo el sentido a un programa así.

madiazg 25-04-2008 10:26:51

Yo utilizo una librería gráfica gratuita:
http://pagesperso-orange.fr/pierre.g/xnview/engfl.html
Con esta librería podrás manipular imágenes. Un ejemplo en la primera versión de un programa que he desarrollado con esta librería:
http://personal.telefonica.terra.es/...rket/imagen3d/
Saludos...

cHackAll 25-04-2008 15:37:27

Cita:

Empezado por kurono (Mensaje 282482)
hola amigos tengo un problema quiero hacer una aplicacion donde le quite lo rojiso a una imagen pues le cuento que tengo unas fotos que me salieron con un tono rosjiso y me gustaria quitarlas como lo puedo hacer

Puedes hacer un barrido XY obteniendo el RGB de cada pixel, y disminuyendo el tono del rojo obtendras lo que necesitas.

Saludos

kurono 26-04-2008 02:09:36

amigo chackall puedes mostrarme un ejemplo de ese barrido xy

cHackAll 28-04-2008 18:33:48

Un barrido podría ser visto como ésto;

Código Delphi [-]
...

 y := bmp.Height;
 repeat Dec(y);                       // barrido vertical
  x := bmp.Width;
  repeat Dec(x);                      // barrido horizontal
   Color := bmp.Canvas.Pixels[X, Y];
   if GetRValue(Color) > 10 then
    bmp.Canvas.Pixels[X, Y] := RGB(GetRValue(Color) - 10, GetGValue(Color), GetBValue(Color));
  until not LongBool(x);
 until not LongBool(y);

...
ó con el uso de un while o un for (simplemente un bucle dentro de otro), sin embargo se puede hacer un barrido de toda la imagen directamente en memoria, lo que mejoraría conciderablemente la velocidad de acceso y el trabajo plano en un vector (a diferencia de en una matriz XY como la del anterior ejemplo).

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;

Saludos

kurono 28-04-2008 18:44:06

ok gracia amigo hack funciona perfectamente pero si no es mucha molestia me gustaria tambien poner la imagen blanco y negro como se haria que debo cambiar en el codigo para hacerlo


La franja horaria es GMT +2. Ahora son las 21:16:08.

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