Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Cambiar color de imagen (https://www.clubdelphi.com/foros/showthread.php?t=76738)

MaxiDucoli 24-11-2011 00:32:01

Cambiar color de imagen
 
Hola a tod@s como están?
Bueno, yo acà molestando de nuevo con mi ignorancia :p

Mi problema es el siguiente:

Quisiera saber como hago para cambiar mediante código el color de un PNG, o sea, como està hecho en la imagen descriptiva de abajo.
Tengo entendido que para hacer algo asi se cambian el color "Base" solamente y de ahi se obtiene el grafico exactamente igual pero con otro color.
Lo que estoy tratando de hacer es un Front End para un programa que hace temas de android y me gustaria ponerle un form con una especie de editor grafico que haga eso.

Estuve mirando en el foro y en google y las funciones que encuentro hacen algo similar, pero me dejan con el mismo tono toda la imagen, o sea el azul es azul y no tiene esos detalles blancos, como de brillo.
Alguien entiendo mas o menos de graficos y puede explicarme como hacerlo?
Muchas gracias a tod@s por el interés de ante mano!
Saludos!!!


Neftali [Germán.Estévez] 24-11-2011 11:16:35

La verdad es que no lo he probado, pero yo haría un test sencillo.

Recorre los pixels de la imagen (alto y ancho) y cambia los valores de color de cada pixel. Básicamente puedes variar los valores RGB o HLS. Revisa la unit GraphUtil, y verás que hay funciones como:
  • ColorRGBToHLS
  • ColorHLSToRGB
  • ColorAdjustLuma
  • HueToRGB
  • GetHighLightColor
  • GetShadowColor

MaxiDucoli 26-11-2011 22:42:45

Cita:

Empezado por Neftali (Mensaje 419322)
La verdad es que no lo he probado, pero yo haría un test sencillo.

Recorre los pixels de la imagen (alto y ancho) y cambia los valores de color de cada pixel. Básicamente puedes variar los valores RGB o HLS. Revisa la unit GraphUtil, y verás que hay funciones como:
  • ColorRGBToHLS
  • ColorHLSToRGB
  • ColorAdjustLuma
  • HueToRGB
  • GetHighLightColor
  • GetShadowColor

Me siento muy estúpido preguntándote esto, pero no se como hacer.
Mirá, yo lo tengo así:

if Sender Is TShape then Col := TShape(Sender).Brush.Color; // Si hago click en el TShape me cambia el color.
ColorRGB := GetRValue(Col) + GetGValue(col) + GetBValue(Col); // Cargo la variable con el color del TShape.
FOR j := 0 TO PNG.Height-1 DO
BEGIN
FOR i := 0 TO PNG.Width-1 DO
BEGIN
// ColorRGB := GetRValue(PNG.Canvas.Pixels[i,j]) + GetGValue(PNG.Canvas.Pixels[i,j]) + GetBValue(PNG.Canvas.Pixels[i,j]);
IF PNG.Canvas.Pixels[i,j] <> ClBlack THEN ColorRGBToHLS(PNG.Canvas.Pixels[i,j],H,L,S); // Este lo seteo con variables WORD y con valores H = 120 - L = 20 - S = 50;
END
END;

Pero al cargar la imagen no me hace nada (obvio que salvo antes de cargarla) :p

Podrías darme "una linea" de como hacerlo por favor??

Neftali [Germán.Estévez] 28-11-2011 12:44:30

1 Archivos Adjunto(s)
Te adjunto una pequeña prueba que cambia los componentes de color de una imagen. Es muy simple. Captura cada uno de los pixels de una imagen y modifica en un porcentaje cada unos de los componentes (red, green, blue).

Puedes utilizar las funciones que te comenté para realizar otras transformaciones, de forma similar. Una vez que lo tengas se pueden realizar optimizaciones, por ejemplo usando ScanLine.

El código de modificación sería algo así:

Código Delphi [-]
procedure TForm6.TrackBar1Change(Sender: TObject);
var
  i,j:integer;
  col, nCol:TColor;
  bmp:TBitmap;
  rval, gval, bval:integer;
begin

  // Creamos un BMP para utilizarlo en las transformaciones
  bmp := TBitmap.Create;
  try
    // Asignamos el contenido
    bmp.Assign(Image1.Picture.Graphic);
    // Asignar al BMP a la segunda imagen (hará de previsualización)
    Image2.Picture.Assign(bmp);

    // Recorridos a lo ancho y alto
    for i := 0 to ((bmp.Canvas.ClipRect.Right - bmp.Canvas.ClipRect.Left) - 1) do begin
      for j := 0 to ((bmp.Canvas.ClipRect.Bottom - bmp.Canvas.ClipRect.Top) - 1) do begin

        // Color actual
        col := bmp.Canvas.Pixels[i, j];
        // Extraemos los componentes de cada pixel
        rval := GetRValue(Col);
        gval := GetGValue(col);
        bval := GetBValue(Col);

        // Aplicamos el cambio segun cada trackbar
        rval := round(rval * (TrackBar1.Position / 100));
        gval := round(gval * (TrackBar2.Position / 100));
        bval := round(bval * (TrackBar3.Position / 100));

        // Color con los cambios
        nCol := RGB (rval, gval, bval);
        // Asignamos el nuevo colo
        bmp.Canvas.Pixels[i, j] := nCol;

      end;
    end;
  finally

    // Asignamos el resultado
    Image2.Picture.Graphic.Assign(bmp);
    // Y liberamos
    FreeAndNil(bmp)
  end;
end;


La franja horaria es GMT +2. Ahora son las 15:13:13.

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