Seite 1 von 1

Images auf die Bildschirmgröße skalieren

Verfasst: 11.04.2006 16:36
von Kallisti
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:

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
Das Problem ist hier, dass manche Bilder korrekt skaliert werden, und andere widerum recht "gestaucht" aussehen. Sorry, für diesen "gruseligen" Code... :o

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

Danke,
Matthias

Verfasst: 11.04.2006 17:14
von inc.
Ohne jetzt deinen Code durchgegangen zu sein .....
PB scheint Probleme bei 24bit Images zu erzeugen, wenn man mit den PB Imagebefehlen skaliert. Bei RGB32 Bildern klappts ohne Probleme.

Verfasst: 11.04.2006 17:44
von MVXA
Versuch mal die 2 hier:
[code][/code]