ich habe vor einiger Zeit mal ein PictureGadget() geschrieben, welches Scrollbalken enthält und auch der Zoom-Faktor festgelegt werden kann. Stellt man ihn auf 0%, wird das Bild automatisch verkleinert bzw. vergrößert. Einfach mal ausprobieren...
Code: Alles auswählen
EnableExplicit
UseJPEGImageDecoder()
UsePNGImageDecoder()
Enumeration ;settings
  #PictureHeight
  #PictureWidth
  #PictureScrollX
  #PictureScrollY
  #PictureScrollW
  #PictureScrollH
  #PictureZoom
EndEnumeration
Structure _PictureItem
  ScrollGadget.i
  ImageGadget.i
  In.i
  Out.i
  Zoom.f
  Smooth.i
EndStructure
Procedure PictureLayout(Gadget)
  ;resizes a loaded picture after resizing the gadget
  Protected *d._PictureItem, gw, gh, iw, ih, gr.f, ir.f, x, y, w, h, mode
  *d = GetGadgetData(Gadget)
  If IsImage(*d\In)
    ;sizes
    iw = ImageWidth(*d\In)
    ih = ImageHeight(*d\In)
    ;fit
    If *d\Zoom = 0
      gw = GadgetWidth(Gadget)
      gh = GadgetHeight(Gadget)
      ;ratios
      gr = gw / gh
      ir = iw / ih
      If gr < ir
        ;use full width
        w = gw
        h = gh / ir * gr
        x = 0
        y = (gh - h) / 2
      Else
        ;use full height
        w = gw * ir / gr
        h = gh
        y = 0
        x = (gw - w) / 2
      EndIf
    Else
      w = iw * *d\Zoom / 100
      h = ih * *d\Zoom / 100
    EndIf
    ;set inner width according new image size
    SetGadgetAttribute(Gadget, #PB_ScrollArea_InnerWidth, w)
    SetGadgetAttribute(Gadget, #PB_ScrollArea_InnerHeight, h)
    ;free memory of previous image
    If IsImage(*d\Out)
      FreeImage(*d\Out)
    EndIf
    ;create new image with new size
    *d\Out = CopyImage(*d\In, #PB_Any)
    If *d\Out
      ;smoothing too small images will take too long (until hang-up)
      If w <= 32 Or h <= 32
        mode = #PB_Image_Raw
      Else
        mode = #PB_Image_Smooth
      EndIf
      ResizeImage(*d\Out, w, h, #PB_Image_Smooth)
      SetGadgetState(*d\ImageGadget, ImageID(*d\Out))
    EndIf
  EndIf
EndProcedure
Procedure PictureGadget(Gadget, x, y, w, h)
  ;create a new picture gadget
  Protected *d._PictureItem, id
  id = ScrollAreaGadget(Gadget, x, y, w, h, 0, 0, 0, #PB_ScrollArea_Center)
  SetGadgetColor(Gadget, #PB_Gadget_BackColor, 0)
  *d = AllocateStructure(_PictureItem)
  *d\ImageGadget = ImageGadget(#PB_Any, x, y, w, h, #Null)
  HideGadget(*d\ImageGadget, #True)
  If Gadget = #PB_Any
    *d\ScrollGadget = id
  Else
    *d\ScrollGadget = Gadget
  EndIf
  SetGadgetData(*d\ScrollGadget, *d)
  CloseGadgetList()
  ProcedureReturn id
EndProcedure
Procedure PictureLoad(Gadget, Filename.s)
  ;loads a new picture
  Protected *d._PictureItem = GetGadgetData(Gadget)
  ;free memory of previous image
  If IsImage(*d\In)
    FreeImage(*d\In)
  EndIf
  ;load image
  *d\In = LoadImage(#PB_Any, Filename)
  ;show or hide gadget
  If IsImage(*d\In)
    HideGadget(*d\ImageGadget, #False)
    PictureLayout(Gadget)
    ProcedureReturn #True
  Else
    HideGadget(*d\ImageGadget, #True)
  EndIf
EndProcedure
Procedure PictureClose(Gadget)
  ;closes the current picture
  Protected *d._PictureItem = GetGadgetData(Gadget)
  ;free memory
  If IsImage(*d\In)
    FreeImage(*d\In)
  EndIf
  ;hide gadget
  HideGadget(*d\ImageGadget, #True)
EndProcedure
Procedure PictureGet(Gadget, Setting)
  ;get gadget attribute
  Protected *d._PictureItem
  *d = GetGadgetData(Gadget)
  If IsImage(*d\In)
    Select Setting
    Case #PictureHeight
      ProcedureReturn ImageHeight(*d\In)
    Case #PictureWidth
      ProcedureReturn ImageWidth(*d\In)
    Case #PictureScrollX
      ProcedureReturn GetGadgetAttribute(Gadget, #PB_ScrollArea_X)
    Case #PictureScrollY
      ProcedureReturn GetGadgetAttribute(Gadget, #PB_ScrollArea_Y)
    Case #PictureScrollW
      ProcedureReturn GetGadgetAttribute(Gadget, #PB_ScrollArea_InnerWidth)
    Case #PictureScrollH
      ProcedureReturn GetGadgetAttribute(Gadget, #PB_ScrollArea_InnerHeight)
    Case #PictureZoom
      ProcedureReturn *d\Zoom
    EndSelect
  EndIf
EndProcedure
Procedure PictureSet(Gadget, Setting, Value)
  ;set gadget attributes
  Protected *d._PictureItem = GetGadgetData(Gadget)
  Select Setting
  Case #PictureScrollX
    SetGadgetAttribute(Gadget, #PB_ScrollArea_X, Value)
  Case #PictureScrollY
    SetGadgetAttribute(Gadget, #PB_ScrollArea_Y, Value)
  Case #PictureZoom
    *d\Zoom = Value
    CompilerIf #PB_Compiler_OS = #PB_OS_Linux
      Protected policy
      If Value
        policy = #GTK_POLICY_AUTOMATIC
      Else
        policy = #GTK_POLICY_NEVER
      EndIf
      gtk_scrolled_window_set_policy_(GadgetID(*d\ScrollGadget), policy, policy)
    CompilerEndIf
    PictureLayout(Gadget)
  EndSelect
EndProcedure
DisableExplicit
CompilerIf #PB_Compiler_IsMainFile
  #Pad = 8
  #Filename = "YourTestPictureFilename.jpg"
  If OpenWindow(0, 0, 0, 600, 480, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
    PictureGadget(0, 0, 0, 600, 480)
    PictureLoad(0, #Filename)
    ;set zoom to 100%
    PictureSet(0, #PictureZoom, 100)
    ;center image
    PictureSet(0, #PictureScrollX, PictureGet(0, #PictureScrollW) / 2)
    PictureSet(0, #PictureScrolly, PictureGet(0, #PictureScrollh) / 2)
    ;event loop
    Repeat
      Select WaitWindowEvent()
      Case #PB_Event_SizeWindow
        w = WindowWidth(0) - #Pad * 2
        h = WindowHeight(0) - #Pad * 2
        ResizeGadget(0, #Pad, #Pad, w, h)
        PictureLayout(0)
      Case #PB_Event_CloseWindow
        Break
      EndSelect
    ForEver
  EndIf
CompilerEndIf