Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-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
Cambiar brillo y color de una imagen

Esta funcion permite tratar de forma independiente cada canal de color de una imagen, esto permite cambiar el color de la imagen o si todos los canales se multiplican por el mismo valor se cambia el brillo.

Puede tratar cualquier imagen soportada por un TPicture (bmp, ico, wmf, emf y jpeg si se añade Jpeg a las uses), aunque la imagen resultante siempre es un bitmap.

Código Delphi [-]
type
  Triple = array[1..3]of Byte;

// Realiza la operacion (b * x) / 128
function Multiplicar(b: Byte; x: Integer): byte;
begin
  x:= (x * b);
  x:= x shr 7;
  if x > 255 then Result:= 255
    else Result:= x;
end;

procedure Canales(Imagen: TPicture; Rojo, Verde, Azul: Byte);
var
  Bitmap: TBitmap;
  P: ^Triple;
  i, j: Integer;
begin
  if not (Imagen.Graphic is TBitmap) then
  begin
    Bitmap:= TBitmap.Create;
    try
      Bitmap.Width:= Imagen.Width;
      Bitmap.Height:= Imagen.Height;
      Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
      Imagen.Assign(Bitmap);
    finally
      Bitmap.Free;
    end;
  end;
  Imagen.Bitmap.PixelFormat:= pf24bit;
  for j:= 0 to Imagen.Bitmap.Height - 1 do
  begin
    P:= Imagen.Bitmap.ScanLine[j];
    for i:= 0 to Imagen.Bitmap.Width - 1 do
    begin
      P^[1]:= Multiplicar(P^[1],Azul);
      P^[2]:= Multiplicar(P^[2],Verde);
      P^[3]:= Multiplicar(P^[3],Rojo);
      inc(P);
    end;
  end;
end;

Ejemplos de uso:
Código Delphi [-]
 // Oscurecemos la imagen de un TImage
 Canales(Image1.Picture,64,64,64);
 // Iluminamos la imagen de un TImage
 Canales(Image1.Picture,192,192,192);
 // Esto no hace nada ya que 128 es el valor central
 Canales(Image1.Picture,128,128,128); 
 
 // Aqui abrimos una imagen, aumentamos el tono de rojo
 // y disminuimos el de azul, luego guardamos la imagen como Jpeg
var
  Imagen: TPicture;
  Jpeg: TJPEGImage;
begin
  Imagen:= TPicture.Create;
  Jpeg:= TJPEGImage.Create;
  try
    Imagen.LoadFromFile('d:\1.jpg');
    // Resaltamos el color rojo y bajamos el azul
    Canales(Imagen,192,128,64);
    Jpeg.Assign(Imagen.Bitmap);
    Jpeg.SaveToFile('d:\2.jpg');
  finally
    Imagen.Free;
    Jpeg.Free;
  end;
end;
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


La franja horaria es GMT +2. Ahora son las 14:27:19.


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