PDA

Ver la Versión Completa : como quitar el color rojo de una imagen


kurono
25-04-2008, 05:12:00
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/web/homemarket/imagen3d/
Saludos...

cHackAll
25-04-2008, 15:37:27
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;

...

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

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