Images auf die Bildschirmgröße skalieren
Verfasst: 11.04.2006 16:36
Hallo zusammen,
für einen kleinen Image-Viewer, den ich nur schreibe, um PureBASIC ein bisschen besser kennenzulernen, möchte ich gern folgendes erreichen:
Ein Bild, dessen Dimensionen entweder Höher oder Breiter (oder beides) als die Ausmaße des Desktops sind, soll unter Beibehaltung der Seitenverhältnisse skaliert angezeigt werden.
Dabei soll das Bild _immer_ die Desktophöhe haben (abzüglich Höhe der Titelleiste und der Taskleiste).
Hier wird die Fenstergröße ohne Taskleiste und Titelleiste berechnet:
Und hier sitzt noch irgendwo ein Fehler:
Das Problem ist hier, dass manche Bilder korrekt skaliert werden, und andere widerum recht "gestaucht" aussehen. Sorry, für diesen "gruseligen" Code...
Könnte mir jemand Tips zur Verbesserung geben? Ich finde den/die Fehler einfach nicht...
Danke,
Matthias
für einen kleinen Image-Viewer, den ich nur schreibe, um PureBASIC ein bisschen besser kennenzulernen, möchte ich gern folgendes erreichen:
Ein Bild, dessen Dimensionen entweder Höher oder Breiter (oder beides) als die Ausmaße des Desktops sind, soll unter Beibehaltung der Seitenverhältnisse skaliert angezeigt werden.
Dabei soll das Bild _immer_ die Desktophöhe haben (abzüglich Höhe der Titelleiste und der Taskleiste).
Hier wird die Fenstergröße ohne Taskleiste und Titelleiste berechnet:
Code: Alles auswählen
Procedure CalcNewWindowHeight()
hWnd = FindWindow_("Shell_TrayWnd", 0)
GetWindowRect_(hWnd, @RECT)
NewWindowHeight = RECT\top
GetWindowRect_(WindowID(), @RECT)
NewWindowHeight = NewWindowHeight - (RECT\bottom - WindowHeight())
EndProcedure
Und hier sitzt noch irgendwo ein Fehler:
Code: Alles auswählen
Procedure ShowImage()
UseImage(ImgID)
If ImageHeight() > NewWindowHeight And ImageWidth() > DesktopWidth(0)
y_ratio.f = NewWindowHeight / ImageHeight()
ResizeImage(ImgID, ImageWidth(), ImageHeight() * y_ratio.f, #PB_Image_Smooth)
x_ratio.f = (DesktopWidth(0) / ImageWidth()) * y_ratio.f
ResizeImage(ImgID, ImageWidth() * x_ratio.f, ImageHeight(), #PB_Image_Smooth)
ts = 1
EndIf
If ImageHeight() > NewWindowHeight And ts <> 1
y_ratio.f = NewWindowHeight / ImageHeight()
ResizeImage(ImgID, ImageWidth() * y_ratio.f, ImageHeight() * y_ratio.f, #PB_Image_Smooth)
EndIf
If ImageWidth() > DesktopWidth(0) And ts <> 1
x_ratio.f = DesktopWidth(0) / ImageWidth()
ResizeImage(ImgID, ImageWidth() * x_ratio.f, ImageHeight() * x_ratio.f, #PB_Image_Smooth)
EndIf
ResizeWindow(ImageWidth(), ImageHeight())
ResizeGadget(1, 0, 0, ImageWidth(), ImageHeight())
SetGadgetState(1, UseImage(ImgID))
SetWindowTitle(0, "FastImageViewer V1.0 - Image: " + Str(nImage)+ " of " + Str(z))
FreeImage(ImgID)
EndProcedure

Könnte mir jemand Tips zur Verbesserung geben? Ich finde den/die Fehler einfach nicht...
Danke,
Matthias