ResizeImage () macht kein #PB_Image_Smooth?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

ResizeImage () macht kein #PB_Image_Smooth?

Beitrag von es_91 »

Hallo, liebe PureBasic-Community!

Lasst mich ein Bisschen ausholen, um das Problem zu beschreiben!

Ich wollte eine Präsentationsapp schreiben, die Folienreihen im MS-DOS-Stil anzeigt. Mit PowerPoint bin ich da an meine Grenzen gestoßen, da andere Rechner für gewöhnlich keine akkuraten Rasterschriftarten besitzen (Lucida Console und Consolas sind was den Pixel-pro-Zeichen-Wert angeht recht ungenau.). Um also keine abgehackten Zeichen am Zeilenende oder abgeschnittene Zeilen am Fuß der Seite zu haben, habe ich eine eigene App geschrieben, die beim Start eine gute Rasterschriftart installiert.

Die Einrichtung der "Folien" oder Seiten war unter einer bestimmten Auflösung keine Schwierigkeit, wohl aber sah das Ganze dann in einer anderen Auflösung ganz anders aus - die Umrechnung der Schriftgrößen wurde zwar von mir genaustens durchgeführt, doch scheinbar kennen Schriftarten keine frei setzbaren Buchstabengrößen, oder die von mir verwendete Schriftart tut dies nicht. Da waren sie wieder, die abgehackten Zeichen und Zeilen. Nicht dumm habe ich mir gedacht: "Zeichne den Folieninhalt auf ein Bild mit fester Größe und strecke dieses einfach auf die derzeitige Bildschirmauflösung."

(Dabei geht zwar etwas Schärfe verloren, aber da diese Präsentationen sowieso nach MS-DOS aussehen sollten, denke ich, sollte das kein Problem darstellen.)

Und als ich mein Image mit DrawImage () in die richtigen Abmessungen brachte, gab es keine Glättung, stattdessen Pixelfehler, welche die Spuren der Vergrößerung darstellten, d.h. die Buchstaben sahen verzerrt aus (siehe die letzten beiden Bilder). Da dachte ich mir: "Du brauchst sicherlich ResizeImage (), da diese Funktion dir das Flag #PB_Image_Smooth anbietet und auch standardmäßig verwendet."

Gedacht, getan!

Doch nun stelle ich fest, dass auf meinem System überhaupt keine Glättung des Bildes durchgeführt wird; in alle Auflösungen, in denen ich mein Programm gestartet habe, weißt das in seiner Größe veränderte Bild Zerrungsfehler auf.

Bild
Bild
Bild


Schaut Euch die Bilder bitte in Microsoft Paint oder etwas Vergleichbarem an und mit starkem Zoom. Wie ihr seht, sieht beispielsweise das x in "Text" in den letzten beiden Fotos extrem verkrüppelt aus. Nur das in seinen Abmessungen 640*480 Pixel große Bild ist korrekt in der Darstellung, da diese Größe auch dem Originalbild entsprach.

Sorry, dass ich (noch) kein Codebeispiel anbiete.

Warum wird auf meinem System keine Glättung durchgeführt? Wird bei Euch auch keine Glättung durchgeführt?

Viele Grüße,

es_91.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ResizeImage () macht kein #PB_Image_Smooth?

Beitrag von STARGÅTE »

Also bei mir gibt es keine Probleme:

Code: Alles auswählen

Enumeration
	#Window
	#Gadget
	#Image
EndEnumeration


CreateImage(#Image, 16, 16, 32)

If StartDrawing(ImageOutput(#Image))
	DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
	Box(0, 0, 16, 16, $FFFF0000)
	Box(4, 4, 8, 8, $FF00FF00)
	StopDrawing()
EndIf

ResizeImage(#Image, 256, 256)

OpenWindow(#Window, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#Gadget, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Die Box wird "Smooth" dargestellt
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: ResizeImage () macht kein #PB_Image_Smooth?

Beitrag von es_91 »

Dieser Beitrag wurde bearbeitet.

Danke, STARGÅTE,

Dein Code, der bei mir super funktioniert, brachte mich auf eine Idee und nun habe ich des Rätsels Lösung!

Um den Speicherbedarf gering zu halten, hatte ich nämlich ein 24-Bit Image verwendet (ursprünglich wollte ich sogar 8 oder 16 Bit verwenden) und daran hang sich die Glättung auf. Den CreateImage ()-Parameter auf 32 Bit geändert und alles passt!

Vielen Dank!

(Bleibt eigentlich nur die Frage, warum mit 24 Bit nicht gesmoothet wird...)
Antworten