Neue ImageList

Rund um die LCL und andere Komponenten

Neue ImageList

Beitragvon Ally » 19. Sep 2018, 10:30 Neue ImageList

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
Ally
 
Beiträge: 85
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 19. Sep 2018, 13:11 Re: Neue ImageList

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2647
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 19. Sep 2018, 13:55 Re: Neue ImageList

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?
Ally
 
Beiträge: 85
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 19. Sep 2018, 16:47 Re: Neue ImageList

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?
wp_xyz
 
Beiträge: 2647
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 19. Sep 2018, 17:26 Re: Neue ImageList

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
Ally
 
Beiträge: 85
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 19. Sep 2018, 18:16 Re: Neue ImageList

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).
wp_xyz
 
Beiträge: 2647
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 20. Sep 2018, 15:38 Re: Neue ImageList

Genau das war's. Form.Create ist zu früh, ab Form.Show funktioniert es auch mit PixelsPerInch.
Danke noch mal - Problem gelöst :)
Ally
 
Beiträge: 85
Registriert: 11. Jun 2009, 08:25

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste

cron
porpoises-institution
accuracy-worried