Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Größe von TBitmap für TImageList anpassen (https://www.delphipraxis.net/145681-groesse-von-tbitmap-fuer-timagelist-anpassen.html)

Leanahtan 6. Jan 2010 01:30


Größe von TBitmap für TImageList anpassen
 
Ich lade in einem Tool mehrere Bitmaps aus einem Archiv, und möchte diese anschließend als Icons in einer TListView verwenden. Also hab ich eine entsprechende TImageList angelegt, in die die benötigten Bilder eingefügt werden. Das klappt soweit auch, allerdings sind mir die Bilder etwas zu groß. Jetzt suche ich nach einer möglichst einfachen (und performanten) Methode, die Bilder für die ImageListe zu verkleinern.

Bisher läuft das ganze so ab:
Delphi-Quellcode:
GetImageByIDStr(Image,TGroundTile(TileSet.GTList[i]).Img0);
j:=SmallGroundTilesImageList.AddMasked(Image,clfuchsia);
Mit GetImageByIDStr wird das Bild aus einem Archiv geladen, und dem TBitmap Image zugewiesen. Nur wie kann ich das TBitmap jetzt verkleinern, bevor ich es an SmallGroundTilesImageList übergebe?

Jens Hartmann 6. Jan 2010 05:21

Re: Größe von TBitmap für TImageList anpassen
 
Hallo Leanahtan,

um eine graphisch gute und hochwertige Grafik in die TListView zu integrieren, ist es vermutlich am besten, wenn Du die Bilder vor dem einfügen in die TImageList mit einem Bildbearbeitungsprogramm auf die entsprechende Größe skalierst. Außerdem, gibt es da so Programme wie..

IcoFx

womit du z.B. richtige .ico Datein erstellen kannst. Ich weiß nicht ob ich 100% richtig liege, aber du wirst wahrscheinlich um diesen Weg nicht umher kommen.

Such mal hier im Forum nach "Icon Bearbeitung" etc.

Gruß Jens

Leanahtan 6. Jan 2010 11:56

Re: Größe von TBitmap für TImageList anpassen
 
Hmm, also das ist für mich keine praktikable Lösung. Es handelt sich ja nicht um einige feste Bilder. Vielmehr kann der Nutzer die Bilder selbst importieren, und diese werden dann in einem vorgeschriebenen Format gebraucht. Nur ist dieses etwas zu groß für die Liste - eine Halbierung von Höhe und Breite würde das deutlich übersichtlicher machen. Für TImage gibt es ja z.B. die Strech-Methode. Aber ich habe eigentlich nicht vor, eine überflüssige Komponente anzulegen, nur um damit ein Bild zu verkleinern. Zur größten Not könnte man auch mit Scannline nur jede zweite Zeile (und davon nur jedes zweite Pixel) in ein zweites TBitmap kopieren - lieber wäre mir aber eine richtige Strechmethode.

Jens Hartmann 6. Jan 2010 12:25

Re: Größe von TBitmap für TImageList anpassen
 
Hallo Leanahtan,

schau sonst mal hier..

bmp to ico

Gruß Jens

Leanahtan 6. Jan 2010 12:51

Re: Größe von TBitmap für TImageList anpassen
 
Vielleicht steh ich ja auf dem Schlauch - aber warum sollte ich das Bitmap in eine TIcon-Variable konvertieren? Die wäre dann doch immernoch genauso groß, und außerdem kann man ein Icon ja noch schlechter in der größe andern, als ein Bitmap.

Vielleicht liegt der Denkfehler auch woanders. Ich brauche die TImagelist nur, um ein Symbol in der Liste anzuzeigen, für alle anderen Anwendungen wird immer die Orginaldatei aus dem Archiv verwendet. Die ImageList wird daher auch nur zur Laufzeit regelmäßig aus Einzelbildern neu aufgebaut (nicht wie sonst vielleicht üblich aus einem einzelnen Bitmap, dass dann in der Liste zerstückelt wird).

Matze 6. Jan 2010 15:16

Re: Größe von TBitmap für TImageList anpassen
 
Hallo,

ich habe mal etwas herumprobiert und das funktioniert bei mir:

Delphi-Quellcode:
procedure AddBmpToImgList(ImgList: TImageList; SourceBmp: TBitmap; IcoWidth: Integer; IcoHeight: Integer);
var
  ImgListBmp: TBitmap;
begin
  ImgListBmp := TBitmap.Create;
  try
    ImgListBmp.Width := IcoWidth;
    ImgListBmp.Height := IcoHeight;

    ImgListBmp.TransparentColor := clFuchsia;
    ImgListBmp.Transparent := True;
    ImgListBmp.TransparentMode := tmAuto;

    // resize bitmap
    StretchBlt(ImgListBmp.Canvas.Handle, 0, 0, IcoWidth, IcoHeight, SourceBmp.Canvas.Handle, 0, 0, SourceBmp.Width, SourceBmp.Height, SRCCOPY);

    // add bitmap to the image list
    ImgList.AddMasked(ImgListBmp, ImgListBmp.TransParentColor);
  finally
    FreeAndNil(ImgListBmp);
  end;
end;
Beispielaufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    if OpenPictureDialog1.Execute then
    begin
      Bmp.LoadFromFile(OpenPictureDialog1.FileName);
      AddBmpToImgList(ImageList1, Bmp, 16, 16);
    end;
  finally
    FreeAndNil(Bmp);
  end;
end;
Grüße, Matze

PS: Was wäre eigentlich, wenn man den Codes hier einfach eine Lizenz verpasst, die bei Verwendung eine Open-Source-Anwendung voraussetzt? *g*

Leanahtan 6. Jan 2010 22:21

Re: Größe von TBitmap für TImageList anpassen
 
Super, vielen Dank. Das ist genau das was ich gesucht habe. Hab die Funktion nur noch um einen Rückgabewert erweitert, und die Parameter IcoWidth und IcoHeight gestrichen. Das zugewiesene Bitmap muss ja sowieso die in der ImageList eingestellten Abmessungen haben - ich verwende daher gleich diese Werte.

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 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