PNG skaliert in TImage laden

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

PNG skaliert in TImage laden

Beitrag von photor »

Hallo Forum,

Ich will in meinem Programm gescante/fotografierte Skizzen zur Parameter-Eingabemaske zeigen. Dazu habe ich ein TImage auf das entsprechende Tab gezogen. Da nicht sehr viel Platz ist hat das eine Größe von (hxb) 232 x 356 Pixeln. Ich werde aber bestimmt noch an den Eingabemasken herum schieben, um das größer zu machen.

In dieses TImage kann ich ein entsprechendes PNG aus einer Datei lesen - wenn es die passende Auflösung hat. Das bedeutet, ich muss das PNG händisch hin skalieren - schlecht, weil viel Arbeit und die muss ich auch noch wiederholen, wenn ich das TImage in der Größe ändere (unten ein kurzes Stück Code; nichts spezielles):

Code: Alles auswählen

	if (FileExists(fullname)) then
	begin
        	NewLogger.LogMessage(llInfo,Format('Loading Image-file: %s',[filename]));
		Image1.Picture.LoadFromFile(fullname);	// 1. Maske
		Image2.Picture.LoadFromFile(fullname)	// 2. Maske
	end
	else
		NewLogger.LogMessage(llInfo,Format('Could not load Image: %s',[filename]))
	end;
Daher meine Frage: gibt es eine Möglichkeit, das PNG beim Laden passend zu skalieren? Hat jemand Tipps oder Hinweise? (bei der Google-Suche drehe ich mich im Kreis).

Ciao,
Photor

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PNG skaliert in TImage laden

Beitrag von af0815 »

Ich würde das Bild in ein BGRABitmap laden. Dann kann man das Bild skalieren bzw. anpassen wie man braucht und im Image oder woanders ausgeben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: PNG skaliert in TImage laden

Beitrag von Socke »

photor hat geschrieben:
So 18. Apr 2021, 19:42
Daher meine Frage: gibt es eine Möglichkeit, das PNG beim Laden passend zu skalieren? Hat jemand Tipps oder Hinweise? (bei der Google-Suche drehe ich mich im Kreis).
Hilft dir die Eigenschaft Stretch weiter?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: PNG skaliert in TImage laden

Beitrag von wp_xyz »

Oder besser: "Proportional", denn da bleibt beim Umskalieren das Verhältnis von Breite zu Höhe erhalten.

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: PNG skaliert in TImage laden

Beitrag von photor »

Ok. Das sind zwei/drei Enden, an denen ich ziehen kann.

Danke,
Photor

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

Re: PNG skaliert in TImage laden

Beitrag von Ally »

Hallo Photor,

Stretch liefert meist ein etwas unbefriedigendes Ergebnis (ausgefranste Kanten, Treppenstufen usw.).
Im beiliegenden Beispiel findest du eine kleine Unit (rhsScaleBitmap.pas) die interpoliert skaliert und somit deutlich bessere Ergebnisse liefert.

Gruß Roland
Skalieren.zip
(244.2 KiB) 89-mal heruntergeladen

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: PNG skaliert in TImage laden

Beitrag von Winni »

Hi!

Hier ist noch ein drittes Ende

Code: Alles auswählen

uses .......,BGRAbitmap;
...
var tmp : TBGRAbitmap;
....
tmp := TBGRAbitmap.Create (DateiName);
BGRAreplace (tmp, tmp.resample(Image1.width, Image1.Height) );
tmp.draw (Image1.Canvas, 0,0);
tmp.free;
...
Winni

Antworten