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