Neue ImageList

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Neue ImageList

Beitrag von Ally »

Hallo,

ich portiere gerade ein Programm nach Lazarus 2.0RC1.
Die High-DPI-Funktionen der neuen ImageList und der entsprechenden Komponenten sind super und ersparen einiges an Programmierarbeit.

Ein Problem habe ich aber.
Bei der alten ImageList konnte ich einem TImage mit

Code: Alles auswählen

ImageList.GetBitmap(9, imgInfo.Picture.Bitmap);
ein Bitmap zuweisen.
Das funktioniert mit der Neuen auch, liefert aber immer nur die kleinste Auflösung der Bitmap-Gruppe.

Mit

Code: Alles auswählen

ImageList.DrawForPPI(imgInfo.Canvas, 0, 0, 9, 24, PixelsPerInch, 1, gdeNormal);
bekomme ich zwar das Bitmap mit der gewünschten Auflösung, aber leider geht hier wohl der Alphakanal verloren.
Alles was eigentlich transparent sein sollte, wird schwarz dargestellt.

Was muss ich machen?

Gruß Roland

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Neue ImageList

Beitrag von wp_xyz »

Ally hat geschrieben:Hallo,
[...] liefert aber immer nur die kleinste Auflösung der Bitmap-Gruppe.

Um auf die zusätzlichen Auflösungen zugreifen zu können, hat die neue ImageList diverse TCustomImageList-Properties mit Namen "ResolutionXXX":

Code: Alles auswählen

    property Resolution[AImageWidth: Integer]: TCustomImageListResolution read GetResolution;
    property ResolutionByIndex[AIndex: Integer]: TCustomImageListResolution read GetResolutionByIndex;
    property ResolutionForPPI[AImageWidth, APPI: Integer; const ACanvasScaleFactor: Double]: TScaledImageListResolution read GetResolutionForPPI;
    property ResolutionCount: Integer read GetResolutionCount;
 

Mit

Code: Alles auswählen

   ImageList1.Resolution[32].GetBitmap(0, Image1.Picture.Bitmap);
kannst du dir das Bitmap mit Größe 32 am Index 0 herausholen.

Ally hat geschrieben:Mit

Code: Alles auswählen

ImageList.DrawForPPI(imgInfo.Canvas, 0, 0, 9, 24, PixelsPerInch, 1, gdeNormal);
bekomme ich zwar das Bitmap mit der gewünschten Auflösung, aber leider geht hier wohl der Alphakanal verloren.
Alles was eigentlich transparent sein sollte, wird schwarz dargestellt.

Bei mir gehts - siehe Anlage. Es liegt wahrscheinlich an dem alten png-bmp Problem: Das TBitmap muss PixelFormat pf32bit haben, um den Alphakanal anzeigen zu können.
Dateianhänge
newimagelist.zip
(3.9 KiB) 80-mal heruntergeladen

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Neue ImageList

Beitrag von Ally »

Hallo wp_xyz,

vielen Dank. ResolutionForPPI ist genau was ich benötige.
der "Einzeiler" holt mir, je nach PPI, die richtige Bitmap aus der ImageList und schreibt sie in mein TImage.

Code: Alles auswählen

 
ImageList.ResolutionForPPI[24, PixelsPerInch, 1].GetBitmap(9, imgInfo.Picture.Bitmap); // funktioniert nicht
ImageList.ResolutionForPPI[24, Screen.PixelsPerInch, 1].GetBitmap(9, imgInfo.Picture.Bitmap); // funktioniert
 

Änderung: PixelsPerInch funktioniert nicht auf einem Rechner mit anderer Auflösung :shock: - Screen.PixelsPerInch schon. Die Frage ist warum?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Neue ImageList

Beitrag von wp_xyz »

Ist das aus einem Formular heraus aufgerufen, so dass PixelsPerInch den Wert von Form1.PixelsPerInch hat? Das sollte derselbe Wert sein, wie Screen.PixelsPerInch (es sei denn das Formular ist auf einem Monitor mit anderer Auflösung). Hast du die Eigenschaft "Scaled" der ImageList auf TRUE gesetzt?

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Neue ImageList

Beitrag von Ally »

Ist das aus einem Formular heraus aufgerufen, so dass PixelsPerInch den Wert von Form1.PixelsPerInch hat?
Ja

Hast du die Eigenschaft "Scaled" der ImageList auf TRUE gesetzt?
Ja

Ich bin erst mal davon ausgegangen das Form.PixelsPerInch sich je nach Umgebung auf dem das Programm ausgeführt wird, ändert.
Das ist nicht der Fall. Der Wert bleibt der den er auf der Entwicklungsumgebung erhalten hat.
Im konkreten Fall: Rechner auf dem das Programm erstellt wurde 144 PPI, Rechner auf dem das Programm ausgeführt wurde 96 PPI.

Der Wert von Screen.PixelsPerInch ändert sich je nach Rechner-Auflösung, funktioniert also. :D

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Neue ImageList

Beitrag von wp_xyz »

Vielleicht ist der Aufruf zu früh: in FormCreate hat Form.PixelsPerInch noch den Design-Wert (Form.DesignTimePPI), aber in FormShow oder FormActivate erhalte ich den aktuellen Wert des Monitors. Der Unterschied zu Screen.PixelsPerInch ist, dass sich die Wert von From.PixelsPerInch auf den Monitor bezieht, auf dem sich das Formular befindet, Screen.PixelsPerInch dagegen nur auf den Hauptmonitor (nicht getestet, ich habe nur 1 Monitor).

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Neue ImageList

Beitrag von Ally »

Genau das war's. Form.Create ist zu früh, ab Form.Show funktioniert es auch mit PixelsPerInch.
Danke noch mal - Problem gelöst :)

Antworten