Bildskalierung mit TImage dauert sehr lange

Rund um die LCL und andere Komponenten
Antworten
ArchChem
Beiträge: 82
Registriert: Mo 11. Jul 2022, 10:41

Bildskalierung mit TImage dauert sehr lange

Beitrag von ArchChem »

Hallo allerseits,

ich möchte auf einer Form ein Hintergrundbild so platzieren, dass es passend „hereingezoomt“ wird – das Seitenverhältnis also nicht verändert wird, sondern stattdessen so lange gezoomt wird, bis die Form vollständig vom Bild ausgefüllt wird – ein Teil des Bildes ist dann abgeschnitten.

Dies löse ich mit einem TImage imgBackground, was entsprechend auf der Form frmPresent positioniert wird. imgBackground.Stretch, imgBackground.StretchInEnabled, sowie imgBackground.StretchOutEnabled sind alle auf true. Mit nachfolgender Positionierung kann ich mein gewünschtes Ergebnis erreichen:

Code: Alles auswählen

imgBackground.Width:=frmPresent.Width;
imgBackground.Height:=frmPresent.Height; 

imgBackground.Picture.LoadFromFile(meinBild);
if imgBackground.Width/imgBackground.Height >= imgBackground.Picture.Width/imgBackground.Picture.Height then
begin
  imgBackground.Height:=Trunc(imgBackground.Width*imgBackground.Picture.Height/imgBackground.Picture.Width);
  imgBackground.Left:=0;
  imgBackground.Top:=-Abs(Trunc((imgBackground.Height-frmPresent.Height)/2));
end
else
begin
  imgBackground.Width:=Trunc(frmPresent.Height*imgBackground.Picture.Width/imgBackground.Picture.Height);
  imgBackground.Left:=-Abs(Trunc((imgBackground.Width-frmPresent.Width)/2));
  imgBackground.Top:=0;
end;
Nun das Problem: Das Skalieren des Bildes dauert mitunter 10-20 Sekunden (abhängig von der Bildgröße). In dieser Zeit ist das Programm nicht weiter nutzbar. Das Problem tritt unter Linux und Windows auf, es scheint also nicht am Framework zu liegen.

Hat jemand eine Idee, wie sich diese Zeit verkürzen lässt?

Vielen Dank schon mal!

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

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von Ally »

Hallo ArchChem,

anbei ein kleines Beispielprogramm.

Gruß Roland
Dateianhänge
rhsBitmapScale.zip
(42.15 KiB) 65-mal heruntergeladen

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

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von wp_xyz »

Nicht ganz deine Anforderung, weil das Folgende nicht das komplette Formular füllt. Aber wenn du ein TImage aufs Formular setzt, das Align des TImage auf clClient, Center = true, Stretch = true und Proportional = true setzt, siehst du im Prinzip wie schnell ein Bild mit Bordmitteln auf die Formulargröße skaliert wird. Bei mir dauert das für ein 15 MPixel-jpg-Foto einige zehn Millisekunden. Wenn es bei dir 1000mal länger dauert, dürfte etwas an deinem Programm nicht stimmen.

Bitte extrahiere den Teil deines Programms, in dem das Bild geladen und skaliert wird, in ein kleines Projekt und poste es hier (in einem zip nur die pas, lfm, lpi und lpr-Dateien, evtl auch das Bild, falls das ganze zip die Forumsupload-Grenze passiert, oder lasse das Bild weg, und nenne uns Größe (Pixel) und dateiformat (jpg, png, bmp oder was auch immer), dann kann jeder ein eigenes Bild für den Test einsetzen).

ArchChem
Beiträge: 82
Registriert: Mo 11. Jul 2022, 10:41

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von ArchChem »

Hallo Roland und wp_xyz,

vielen Dank für eure Antworten!

@Roland: bei deinem Beispielprogramm kann ich den Fehler reproduzieren, sprich, auch dort tritt er auf – und zwar bei einem JPG-Bild mit den Maßen 4608x3456 Pixel (ca. 500 kb Größe). Bei anderen Bildern geht die Skalierung zwar schneller, aber ist auch lange noch nicht befriedigend (habe eigentlich neuste Hardware, andere Programme machen überhaupt keine Probleme).

Leider kann ich das Problem-Bild aus Urheberrechtsgründen nicht veröffentlichen.... Vielleicht liegt der Fehler doch am QT5-Toolkit?
wp_xyz hat geschrieben:
Fr 26. Aug 2022, 15:58
Bitte extrahiere den Teil deines Programms, in dem das Bild geladen und skaliert wird, in ein kleines Projekt und poste es hier (in einem zip nur die pas, lfm, lpi und lpr-Dateien, evtl auch das Bild, falls das ganze zip die Forumsupload-Grenze passiert, oder lasse das Bild weg, und nenne uns Größe (Pixel) und dateiformat (jpg, png, bmp oder was auch immer), dann kann jeder ein eigenes Bild für den Test einsetzen).
Wir können gerne das Minimalbeispiel von Roland als Referenz verwenden, die Maße und Format des Bildes siehe oben.

Viele Grüße
Jan Martin

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von theo »

Das ist ja auch ein monströs grosses Bild, was erwartest du denn?
Wenn ich mit Gimp in den Standardeinstellungen so ein Ding erstellen will, kriege ich auch schon eine Warnmeldung.
Wozu brauchst du denn so ein Monsterbild?

gimpwarn.png
gimpwarn.png (69.8 KiB) 1376 mal betrachtet

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

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von wp_xyz »

Ich habe eben ein Beispiel-Programm zusammengeklickt, in dem ein jpg-Foto (das ich auf die von dir als problematisch bezeichnete Größe von 4608x3456 skaliert und zugeschnitten habe) per StretchDraw nach deinen Vorgaben direkt auf den Canvas das Formulars gemalt wird, und das Fenster wird normal schnell aufgebaut und reagiert bei Größenveränderung des Formulars einigermaßen zügig. Die Qualität bei starker Verkleinerung ist nicht berauschend, Rolands Skalierungsroutine mit Hilfe der FP-Image-Routinen ist deutlich besser, aber auch deutlich langsamer bei der Größenveränderung. Und winni wird uns sicher BGRABitmap empfehlen, das wahrscheinlich gute Qualität und hohe Geschwindigkeit kombiniert. Aber es ging mir hier nur ums Prinzip: bei 20 Sekunden Rechenzeit ist etwas faul, und ich kann mir nicht vorstellen, dass das an den Lazarus/FPC-Routinen liegt.
Dateianhänge
image-scale.zip
(287.36 KiB) 54-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: Bildskalierung mit TImage dauert sehr lange

Beitrag von Ally »

Für das Skalieren eines 24 Megapixel Fotos (6000 x 4000) benötigt mein sieben Jahre alter i5-6400 2.70GHz unter Win 10, mit meinem Beispielprogramm, 1,2 Sekunden.
Das Ganze bei einer Skalierung auf 50% der Originalgröße. Skaliert man größer dauert es länger, Skaliert man kleiner geht es schneller.
Ich denke das ist für eine qualitativ brauchbare Skalierung nicht soooo schlecht.

Gruß Roland

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von Winni »

Hi!

Das ganze beschleunigt sich deutlich mit Hilfe der BGRAbitmap.

Code: Alles auswählen

uses ......,BGRAbitmap;

var tmp : TBGRAbitmap;
...
    tmp := TBGRAbitmap.create(Image1.picture.bitmap);
    BGRAreplace (tmp,tmp.resample (NewWidth, NewHeight));
    tmp.draw(Image1.canvas,0,0,true);
    tmp.free;
Winni

ArchChem
Beiträge: 82
Registriert: Mo 11. Jul 2022, 10:41

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von ArchChem »

Hallo,

danke für eure zahlreichen Rückmeldungen! Bitte entschuldigt meine späte Antwort. Urlaubsbedingt komme ich erst jetzt dazu, mir die verschiedenen hier beschriebenen Lösungen anzuschauen. Leider besteht das Problem immer noch weiter, ich habe mal einen Screencast mit einem Beispiel gemacht, zwischen den Sekunden 4 bis 5 sieht man das Ganze sehr deutlich. Das Bild ist Public Domain und hier abrufbar.
Winni hat geschrieben:
Sa 27. Aug 2022, 12:58
Das ganze beschleunigt sich deutlich mit Hilfe der BGRAbitmap.
Danke für den Hinweis! Ich habe versucht, BGRAbitmap zum Laufen zu bringen. Leider werde ich weder aus dem Wiki noch aus Lazarus selbst heraus Schlau, wie man dieses Package installiert. Könntest du mir eventuell bitte eine kurze Zusammenfassung geben? Vielen Dank!

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bildskalierung mit TImage dauert sehr lange

Beitrag von Winni »

Hi!

Das einfachste ist der Online-Package-Manager:

Package --> Online-Package Manager

Ist eigentlich selbsterklärend. Hab gerade kein Lazarus zur Hand.

Winni

Antworten