Images auf die Bildschirmgröße skalieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kallisti
Beiträge: 1
Registriert: 11.04.2006 16:19
Wohnort: Hagen
Kontaktdaten:

Images auf die Bildschirmgröße skalieren

Beitrag 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
Zuletzt geändert von Kallisti am 11.04.2006 20:38, insgesamt 1-mal geändert.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag 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.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Versuch mal die 2 hier:
[code][/code]
Bild
Antworten