Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   PNG in Bitmap-Layer laden (https://www.delphipraxis.net/214960-png-bitmap-layer-laden.html)

banaguitar 11. Apr 2024 18:23

PNG in Bitmap-Layer laden
 
Hallo,

ich möchte ein PNG in einen Bitmap-Layer laden und habe das Problem, dass das png, welches ich als klickbaren Button nutzen möchte, nicht die korrekte Größe hat, sondern viel zu klein dargestellt wird.
Alles andere passt. Was stimmt an meinem Code nicht?


Code:
ImgView.Layers.Clear;
ImgView.scalemode := smResize;
ImgView.Bitmap.LoadFromFile('background.jpg');

BL := TBitmapLayer.Create(ImgView.Layers);
LoadBitmap32FromPNG(BL.bitmap,'button.png');
BL.Bitmap.DrawMode := dmtransparent;
BL.Scaled := true;
BL.OnClick := OnClickButton;
Vielen Dank!

jaenicke 12. Apr 2024 07:08

AW: PNG in Bitmap-Layer laden
 
Kann es sein, dass du eine andere Skalierung als 100% in Windows eingestellt hast?

Kannst du daraus vielleicht ein kleines Beispielprojekt erstellen, damit das Problem nachvollziehbar ist?

banaguitar 12. Apr 2024 11:45

AW: PNG in Bitmap-Layer laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, ja, klar, mache ich gerne. Das png sieht echt auch nicht gut aus an den Kanten. Habe auch mal auf dmblend gestellt, sieht genauso hässlich aus. Skalierung ist bei Windows auf 100% eingestellt.

banaguitar 12. Apr 2024 18:16

AW: PNG in Bitmap-Layer laden
 
Ich habe ein kleines Beispielprojekt hinzugefügt. Die Hintergrundbilder varrieren, aber das ist ja erstmal egal. SetSize ändert in diesem Fall nichts, daher habe ich weggelassen.

jaenicke 12. Apr 2024 21:07

AW: PNG in Bitmap-Layer laden
 
Ich habe Graphics32 noch nie benutzt, deshalb hatte ich nach einem Beispielprojekt gefragt. Ich musste auch kurz schauen, aber dann bin ich über Location gestolpert:
Delphi-Quellcode:
...
BL.Location := TRectF.Create(10, 10, 500, 500);

Michael II 16. Apr 2024 16:30

AW: PNG in Bitmap-Layer laden
 
Ich würde im FormResize die Grösse anpassen.

Delphi-Quellcode:
var BL:TBitmapLayer;
    origwidth, origheight : integer;
    origbitmap : TBitMap32;
...

procedure TForm1.FormCreate(Sender: TObject);
...

begin
  origwidth := clientwidth;
  origheight := clientheight;
...
  // ich verwende noch eine alte Version von Graphics32 ohne direkte PNG Unterstützung:
  png := TPNGImage.Create;
  png.LoadFromFile( ExtractFilePath(ParamStr(0)) + 'images\next.png' );
  origbitmap.Assign(png);
  BL.bitmap.assign(origbitmap);
...
procedure TForm1.FormResize(Sender: TObject);
var
  Scale: Single;
begin
  if (ClientWidth > 0) and (ClientHeight > 0) then
  begin
    Scale := Min(ClientWidth / origwidth, ClientHeight / origheight );
    bl.Bitmap.SetSize(Round(Origbitmap.Width* Scale), Round(Origbitmap.Height* Scale));
    bl.Bitmap.Draw(bl.Bitmap.BoundsRect, OrigBitMap.BoundsRect, OrigBitMap);
  end;
end;

initialization
origbitmap := TBitMap32.Create;
finalization
origbitmap.Free;
end.
Wenn du mehrere Layers verwendest:
TImage32 -> TLayerCollection
TIMage32 kennt die Eigenschaft Layers. Du kannst Bilder deiner Buttons, Spielkarten, Raumschiffe etc. beim Programmstart laden. Dann hast du via die Layers Zugriff auf die Bitmaps und kannst im FormResize auf einfache Weise alle Bitmaps anpassen. (Wenn du die Layerfunktionalität nicht benötigst: TBitmap32List.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz