[Gelöst] Timage Bug? Bild skaliert nicht richtig

Rund um die LCL und andere Komponenten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

[Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Ich machs kurz. Wo bin ich diesem #@=>$$ :-()! jetzt wieder auf die Zehen getreten?

Bild: Originalgröße 288x63 (bmp oder png, hab beide probiert), mit den Forms Designer als "Picture" in ein TImage mit width = 288, height = 63 eingefügt. Klingt beherrschbar, oder? Ich will keinerlei Veränderung, Bildverbesserung, Technology, einfach nur nix als die Pixels bitte in den Rahmen. Alle Optionen aus (Proportional, Stretch..., kein Border, kein Align, keine Spacings, keine Constraints). Den Rest sagt der Screenshot. Vorschau im Form Designer ist OK, zur Laufzeit wird das Bild gedehnt und geclippt.

Ich kann dagegen halten und StretchInEnabled setzen, dann passt die Größe, aber die Qualität leidet deutlich. Das Bild wird dann wohl erst gestreckt und dann wieder klein gerechnet.

Ich kann das Timage, um eventuelle Borders zu kompensieren, auch ein paar Pixels größer machen, das Bild wird trotzdem nach rechts unten verschoben.
Logo Größe Problem.png
Logo Größe Problem.png (33.02 KiB) 1561 mal betrachtet
Übliche Fragen: warum passiert das, und was kann ich dagegen tun?

Armin.
Zuletzt geändert von Nimral am Mo 17. Mai 2021, 18:05, insgesamt 1-mal geändert.

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

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

Das ist doch ein einfaches Programm, so dass du einfach ein kleines Demoprojekt zusammenstöpseln kannst, so dass jeder das Verhalten nachvollziehen kann (oder auch nicht...). Aber wenn das hier hochgeladen ist, tun wir uns viel leichter das Problem zu analysieren und zu lösen.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Testprogramm nagle ich gerade zusammen. Problem tritt auch auf mit einem leeren Form und nur einem TImage drauf. Ich dachte, vielleicht kennt jemand das Problem schon vom Anschauen ...

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

So, hier das Testprogramm (Lazarus 2.0.12 32 Bit auf Windows 10 x64.)
TImage Problem.png
TImage Problem.png (17.48 KiB) 1548 mal betrachtet
Auffällig: Laut dem Ruler ist das TImage nur 160 Pixels breit, eingegeben sind aber 200. Wären es wirklich 200 Pixels, würde das Bild reinpassen.
Dateianhänge
Timage Bug.zip
(126.26 KiB) 45-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Hab glaub ich einen (lästigen) Workaround. Wenn ich AutoSize auf true setze, ist das Bild in der compilierten Version OK, nur im Formulareditor ist es falsch.

--> der Fehler liegt wohl in der IDE / im Formular-Editor, er macht die TImages kleiner als in width und height angegeben.

Armin,
Dateianhänge
Gleiches Programm mit AutoSize=true
Gleiches Programm mit AutoSize=true
TImage Problem 1.png (17.45 KiB) 1546 mal betrachtet

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Ich hab es selber lösen können, gut dass ich die Screenshots als Beweis habe, sonst würde ich an mir selber zweifeln.

Einmal Lazarus zu und wieder auf, und alles ist normal.

Armin.

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

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

200/160 = 1.25. Ich nehme an, dass du an einem Bildschirm arbeitest, der auf 120ppi Pixeldichte geschaltet ist ("125%" in Windows-Nomenklatur). Und ich nehme an, dass LCL-Scaling eingeschaltet ist, denn das ist Default seit Laz 2.0.

Wenn du nun ein TImage mit 200 x 50 Pixels auf dem Formular plazierst, wurde dieses mit dem "Maßstab" 120ppi erzeugt. Du hast das nicht geschrieben, aber ich vermute, du bist dann zur laufzeit auf ein anderes System gegangen, das mit 96ppi (100%) läuft. LCLScaling rechnet nun alle Längendimensionen von 120% auf 100% runter. Das Formular wird kleiner, die Schrift wird kleiner, und auch das TImage wird kleiner - nicht aber sein Inhalt. Daher passt bei 100% das Bild nicht mehr ins TImage.

Ich hab's ausprobiert, und konnte das beim Übergang von einer 150%-VM auf mein Standard-System bei 100% bestätigen .

Was kannst du tun? Am einfachsten ist es, wenn du zur Laufzeit die Größe der TImage-Komponente gleich der Bildgröße setzt (oder man könnte im Verhältnis der aktuellen PixelsPerInch zu den DesigntimePPI des Formular umrechnen):

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Width := Image1.Picture.Width;
  Image1.Height := Image1.Picture.Height;
end;
(Bin nicht sicher, ob FormCreate die geeignete Stelle für diese Code ist...)

Wenn du wie hier die Größe der Controls zur Laufzeit änderst, musst du darauf gefasst sein, dass es Konflikte mit der Position anderer Controls geben kann. Daher rate ich unbedingt, den Anker-Editor zur benutzen, mit dem du Controls aneinander hängen kannst, so dass, wenn ein Control größer wird, die anderen folgen können und das Layout stimmig bleibt. Nachteil ist aber, dass das Bild relativ zu den Controls kleiner wird, wenn dein Programm z.B. auf einem super-high-res-Bildschirm läuft (normale 16x16-Icons sind da kaum mehr zu erkennen).

Eine andere Möglichkeit wäre, mit mehreren Bildern verschiedener Größe zu arbeiten, üblicherweise für 100%, 150% and 200% Pixeldichte. Dann skaliert der Bildinhalt mit dem TImage, und das Layout der Komponenten untereinander bleibt unbeeinflusst.

Oder du malst deine Bilder als svg und benutzt BGRABitmap zu deren Darstellung (oder FPVectorial, aber das ist sehr buggy).

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

Re: Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

Nimral hat geschrieben:
Mo 17. Mai 2021, 18:05
Einmal Lazarus zu und wieder auf, und alles ist normal.
Das verstehe ich nun wiederum nicht mehr... Was hast du Schritt für Schritt gemacht, seit Beginn des Projekts?

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Ich gebe zu, ich kann Deinen Schlüssen nicht im Detail folgen, aber dass es mit dem Scaling zu tun hat ist richtig. Ich habe im Moment ein stark unsymmetrisches System, ein Laptop mit Full-HD und daran einen 4k mit 54(?) Zoll. Ich habe aus anderen Gründen im Lauf des Tages von 125% Skalierung, mit der ich am Laptop-Schirm angenehmer arbeiten kann weil sonst alles recht winzig wird, auf 100% Skalierung umgestellt, und dabei lief die Lazarus IDE im Hintergrund weiter. Bis zum nächsten Neustart ist sie wohl durcheinander geraten.

Ich hoffe nicht, dass Du Recht hast, das hieße dann doch, dass auf 96 dpi Anlagen entwickelte Programme auf 120 dpi Rechnern Probleme bekommen und umgekehrt. Das darf dann wohl nicht sein.

Ich versuchs aber gleich nochmal: mach ein Form mit Logo auf 120dpi, compiliere, stelle um auf 96dpi und schau ob alles richtig läuft, und dann umgekehrt.

Kleinen Moment ...

Armin.

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

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

Nimral hat geschrieben:
Mo 17. Mai 2021, 18:22
Ich hoffe nicht, dass Du Recht hast, das hieße dann doch, dass auf 96 dpi Anlagen entwickelte Programme auf 120 dpi Rechnern Probleme bekommen und umgekehrt. Das darf dann wohl nicht sein.
Ist es auch nicht. Mit dem LCLSkaling wird das berücksichtigt. Die Ausnahme sind Bilder; diese musst du in verschiedenen Größen vorhalten. So wie in der neuen TImageList, die seit Laz 2 verschiedene Größe verwalten kann.

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

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

Nimral hat geschrieben:
Mo 17. Mai 2021, 18:22
Ich versuchs aber gleich nochmal: mach ein Form mit Logo auf 120dpi, compiliere, stelle um auf 96dpi und schau ob alles richtig läuft, und dann umgekehrt.
Du musst zur Sicherheit zwischen dem Wechseln der Auflösung Lazarus herunterfahren. Ich weiß nicht, ob wirklich sichergestellt ist, dass die IDE das mitkriegt. Du kannst in einem Test ja mal auf die Eigenschaft DesigntimePPI des Formulars gucken.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Also meine Testergebnissesage ... alles halb so schlimm, wenn man es erst weiß.

Mache ich ein Form mit Timage und Timage-Abmessungen gleich Bildabmessungen, klappt das sowohl auf 100% wie auch auf 125% Skalierung, Das Programm das entsteht läuft auf beiden Einstellungen und ich konnte - außer dass alles kleiner oder größer wird - keinen Unterschied sehen. Der "Verschiebeeffekt" tritt nicht ein. Soweit zur .exe.

Wenn ich jetzt Lazarus mit einbeziehe und ein Projekt öffne, das ich mit sagen wir mal 100% Einstellung erstellt habe, und ich habe den Rechner inzwischen auf 125% eingestellt (Lazarus war nicht gestartet), fällt das Formular auseinander, weil sich alle Höhen- und Breitenwerte plötzlich öndern, außer bei den TImages (und das find ich echt übel ...), die bleiben genau so wie ich sie vorher gespeichert hatte. Der Formulareditor zeigt das allerdings deutlich sichtbar an, und ich kann, wenn ich will, mit der GUI korrigieren indem ich z.B. die Paneele und Buttons wieder auf die alte Größe einstelle.

Wieder entsteht eine exe, die auf beiden Einstellungen richtig funktioniert.

Also Problem 1: wechsle ich beim Entwickeln den Rechner bzw. die Einstellung kann es mir passieren, dass Formulare durcheinander geworfen werden. AWL.

Die Falle wo ich reingetappt bin tritt auf, wenn ich die Einstellung ändere, Lazarus aber nicht neu starte. Dann schaut das Formular im Formulareditor richtig aus, und auch die Zahlenangaben für Höhe und Breite stimmen, in der kompilierten exe ist es aber genau so zerwürfelt wie es die Screenshots oben zeigen.

Einmal Lazarus zu und wieder auf und ggf. die Formulare nachkorrigiert und der Spuk ist vorbei. Oder ich achte darauf, wenn ich mit Lazarus arbeite, auf allen Systemen immer 125% eingestellt zu lassen.

Dürfte allerdinigs spannend werden, wenn ich eine Source z.B. nach Linux rüber spiele und daran weiter arbeiten möcte ...

Armin,

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

... und jetzt, wo Du es erwähnst, sehe ich auch, dass sich die Einstellung "DesigntimePPI" mit der Windows Einstellung mit ändert (wenn ich Lazarus neu starte), auch für bestehende Formulare.

AWL und mal wieder vielen Dank,

Armin.

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

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von wp_xyz »

Nimral hat geschrieben:
Mo 17. Mai 2021, 19:00
außer bei den TImages (und das find ich echt übel ...), die bleiben genau so wie ich sie vorher gespeichert hatte.
Das verstehe ich nicht. Die TImage-Komponente muss sich genauso wie alle anderen Controls auf dem Formular um denselben Faktor in der Größe ändern (natürlich nicht das enthaltene Bild). Wenn sie das nicht tut, ist etwas oberfaul.

1. Ist LCLScaling eingeschaltet?
2. Ist im Kontextmenü des Formulareditors die Option "Force DPI Scaling in Designtime" angewählt?

Ich habe das ganze auf meinem System nachgespielt. Ich habe in einer VM mit Win7 begonnen, das auf 150% läuft (wollte nicht auf 125% umstellen). Das erstellte Formular ist 400 Pixel breit und 100 Pixel hoch. In der linken oberen Ecke sitzt ein TImage, 200x50, mit deinem Bild geladen. In der rechten Ecke sitzt ein TButton, auch 200x50 Pixel groß. Das Projekt ist in dieser Form gespeichert und beigefügt. Zur Kontrolle die lfm-Datei mit einem Editor öffnen: die DesigntimePPI ist 144 (=150% von 96). Der Screenshot der auf diesem System kompilierten Exe ist "Screenshot_144".

Nun verlasse ich die VM und gehe auf mein normales System, das mit Win 10 auf 96ppi (100%) läuft. Ich starte die eben erwähnte exe -> "Screenshot_96". Das Formular mit seinen Controls ist genau im Verhältnis 150:100 kleiner, wie erwartet. Nur der Inhalt der TImage-Komponente passt nicht, aber wie ich erklärt habe, ist das auch zu erwarten, denn das Bitmap wird nicht skaliert; durch ein in der Größe angepasstes neues Bild könnte man das beheben.

Schließlich lade ich das unter 150% entworfene Projekt in die IDE, die unter 100% läuft. Der Objektinspector zeigt an, dass das Formular nun 267x67 ist, TImage und TButton sind gleich groß und haben hat 133x33. Alle Dimensionen sind also im Verhältnis 100:150 geschrumpft, genauso wie eben bei der exe: Der Objektinspektor zeigt nun als DesigntimePPI den Wert 96 an - das ist quasi die Maßeinheit für die Längen.

Das Projekt speichere ich als Project_96ppi. Wenn ich jetzt die lfm-Datei mit einem Editor öffne, steht noch DesigntimePPI drinnen und als Formularbreite 400 - das ist weil ich noch nichts verändert habe. Wenn ich aber die Formularbreite kurz verändere und dann wieder auf den alten Wert von 267 setze stehen in der lfm Datei die neuen Dimensionen, und die DesigntimePPI-Angabe fehlt, das heißt, sie hat den Default-Wert von 96.

Das ist alles so wie es sein soll.
Dateianhänge
screenshot_96.png
screenshot_96.png (2.01 KiB) 1495 mal betrachtet
screenshot_144.png
screenshot_144.png (6.54 KiB) 1495 mal betrachtet
lclscaling_144ppi.zip
(1.99 KiB) 41-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: [Gelöst] Timage Bug? Bild skaliert nicht richtig

Beitrag von Nimral »

Vielen Dank für Deine Mühe, und nix für ungut, ich muss sehen dass ich mit dem Projekt weiter komme, Mittwoch ist Deadline, und dieses dämliche Problem hat mich wieder einen halben Tag gekostet. Ich kann ggf. mehr Aufwand in das Thema stecken wenn ich den Mittwoch überlebt habe.

Einen schnellen Blick in Dein Projekt habe ich dennoch geworfen ... ich sehe, Du hast beim TImage Autosize nicht an, ich habs mal aktiviert (siehe oben, erster angeblicher Workaround). Nachdem ich die Lazarus-Verwirrung durch Neustart behoben hatte habe ich AutoSize stehen lassen. Vielleicht ist der die Ursache dass die TImages sich bei mir anders verhalten wie die anderen Controls.

Die High-DPI Schalter und Force DPI Scaling stehen bei mir auf on, hab die Defaults nie verändert.

Und jetzt muss ich sehen, dass ich mit meinem Projekt weiter komme, sorry.

HG, Armin.

Antworten