Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Insertar una imagen en un TShape (https://www.clubdelphi.com/foros/showthread.php?t=97633)

CarlosCorp 13-08-2025 21:42:21

Insertar una imagen en un TShape
 
Buenas tardes amigos. Mi consulta es si existe alguna forma de asignar una imagen a un TShape (como se hace con un TImage). En vez de darle un color me gustaría ponerle una imagen como si fuera una textura.
Gracias de antemano.

Casimiro Noteví 14-08-2025 09:25:32

Creo que no, pero puedes usar una imagen igualmente, si lo que pretendes es ponerlo de fondo.

CarlosCorp 14-08-2025 15:47:12

Cita:

Empezado por Casimiro Notevi (Mensaje 567064)
Creo que no, pero puedes usar una imagen igualmente, si lo que pretendes es ponerlo de fondo.

Gracias por responder. Lo que pretendo es usar un TShape como un objeto que pueda mover con el mouse dentro del form. El programa tendrá muchos objetos (de 1 a 600 más o menos) que se podrán manipular con el mouse. Quizás usar esa cantidad de TImage no sea muy conveniente 🤔

Casimiro Noteví 14-08-2025 18:25:24

Prueba algo así, a ver si te sirve:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  DibujarDegradado(TImage1.Canvas, TImage1.ClientRect, clYellow, clRed);
end;

procedure TForm1.DibujarDegradado(ACanvas: TCanvas; ARect: TRect; Color1, Color2: TColor);
var
  i, R1, G1, B1, R2, G2, B2: Integer;
  R, G, B: Integer;
  LineRect: TRect;
begin
  // Descomponer colores
  R1 := GetRValue(ColorToRGB(Color1));
  G1 := GetGValue(ColorToRGB(Color1));
  B1 := GetBValue(ColorToRGB(Color1));

  R2 := GetRValue(ColorToRGB(Color2));
  G2 := GetGValue(ColorToRGB(Color2));
  B2 := GetBValue(ColorToRGB(Color2));

  for i := 0 to ARect.Bottom - ARect.Top do
  begin
    // Interpolación lineal de colores
    R := R1 + MulDiv(R2 - R1, i, ARect.Bottom - ARect.Top);
    G := G1 + MulDiv(G2 - G1, i, ARect.Bottom - ARect.Top);
    B := B1 + MulDiv(B2 - B1, i, ARect.Bottom - ARect.Top);

    ACanvas.Brush.Color := RGB(R, G, B);
    LineRect := Rect(ARect.Left, ARect.Top + i, ARect.Right, ARect.Top + i + 1);
    ACanvas.FillRect(LineRect);
  end;
end;
Pon un TImage en el formulario, ajusta su align o tamaño para que ocupe el área que quieras y llama a DibujarDegradado(...) con los colores que quieras.

Casimiro Noteví 14-08-2025 18:30:10

La otra opción usando un .bmp como textura sería algo así:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Shape1.Brush.Style := bsClear; // No lo usaremos, pero por seguridad
  Shape1.Pen.Color := clBlack;
  
  // Cargar la textura desde un fichero BMP
  Shape1.Brush.Bitmap := TBitmap.Create;
  Shape1.Brush.Bitmap.LoadFromFile('C:\mi_textura.bmp');
end;
Brush.Bitmap solo soporta bmp en Delphi 6 (que es con lo que lo he probado), si quieres png o jpg tendrás que usar TPngImage o TJPEGImage y dibujarlo manualmente en un TImage o TPaintBox.
El bitmap se repetirá como un mosaico para rellenar todo el área.

CarlosCorp 14-08-2025 22:51:59

Cita:

Empezado por Casimiro Notevi (Mensaje 567084)
La otra opción usando un .bmp como textura sería algo así:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Shape1.Brush.Style := bsClear; // No lo usaremos, pero por seguridad
  Shape1.Pen.Color := clBlack;
  
  // Cargar la textura desde un fichero BMP
  Shape1.Brush.Bitmap := TBitmap.Create;
  Shape1.Brush.Bitmap.LoadFromFile('C:\mi_textura.bmp');
end;
Brush.Bitmap solo soporta bmp en Delphi 6 (que es con lo que lo he probado), si quieres png o jpg tendrás que usar TPngImage o TJPEGImage y dibujarlo manualmente en un TImage o TPaintBox.
El bitmap se repetirá como un mosaico para rellenar todo el área.

Gracias por las ideas. Las probaré para ver cómo queda 👍

CarlosCorp 15-08-2025 01:12:34

Cita:

Empezado por Casimiro Notevi (Mensaje 567084)
La otra opción usando un .bmp como textura sería algo así:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Shape1.Brush.Style := bsClear; // No lo usaremos, pero por seguridad
  Shape1.Pen.Color := clBlack;
  
  // Cargar la textura desde un fichero BMP
  Shape1.Brush.Bitmap := TBitmap.Create;
  Shape1.Brush.Bitmap.LoadFromFile('C:\mi_textura.bmp');
end;
Brush.Bitmap solo soporta bmp en Delphi 6 (que es con lo que lo he probado), si quieres png o jpg tendrás que usar TPngImage o TJPEGImage y dibujarlo manualmente en un TImage o TPaintBox.
El bitmap se repetirá como un mosaico para rellenar todo el área.

Ésta opción es lo que quería, pero no se si se podrá hacer que el bmp se adapte al tamaño del TShape. Algo así como la propiedad Stretch del TImage.
De todos modos gracias por la ayuda.

Casimiro Noteví 15-08-2025 11:21:57

Puedes hacerlo tú mismo, una vez cargado el bitmap tomas sus medidas ancho y alto, y le asignas esas mismas medidas al shape.

CarlosCorp 15-08-2025 17:20:53

Cita:

Empezado por Casimiro Notevi (Mensaje 567091)
Puedes hacerlo tú mismo, una vez cargado el bitmap tomas sus medidas ancho y alto, y le asignas esas mismas medidas al shape.

Tienes razón, pero sería al revés, el bitmap debe tener las medidas del TShape.
Lo probaré. Muchas gracias por la ayuda. 😁👍


La franja horaria es GMT +2. Ahora son las 14:04:35.

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