ResizeImage() und ImageID()
Verfasst: 02.02.2007 14:44
Eine Verständnisfrage zu ResizeImage()
Habe ein kleines Progrämmchen zur Anzeige von Grafiken mit Zoomfunktion geschrieben. Klappt jetzt auch so, wie ich mir das gedacht habe. In der Hilfe zu ResizeImage() steht, daß durch diese Funktion das Handle der Grafik geändert wird. Nun möchte ich vor einem weiteren Zoomvorgang dieses Image wieder freigeben mit FreeImage(). Klappt jedoch nicht, weil ResizeImage anscheinend nicht wirklich eine ImageID zurückliefert. Die Funktion IsImage() liefert mir hier immer den Wert 0.
Bedeutet das, daß ich mir nach und nach den Speicher zumülle? Oder bin ich da ganz auf dem Holzweg?
Code editiert - spaces bei den window-flags eingefügt,
damit das forenfenster nicht so breit gezogen wird.
@All: macht das doch mal bitte von vorne herein.
Kaeru fecit
Habe ein kleines Progrämmchen zur Anzeige von Grafiken mit Zoomfunktion geschrieben. Klappt jetzt auch so, wie ich mir das gedacht habe. In der Hilfe zu ResizeImage() steht, daß durch diese Funktion das Handle der Grafik geändert wird. Nun möchte ich vor einem weiteren Zoomvorgang dieses Image wieder freigeben mit FreeImage(). Klappt jedoch nicht, weil ResizeImage anscheinend nicht wirklich eine ImageID zurückliefert. Die Funktion IsImage() liefert mir hier immer den Wert 0.
Bedeutet das, daß ich mir nach und nach den Speicher zumülle? Oder bin ich da ganz auf dem Holzweg?
Code: Alles auswählen
EnableExplicit
Define MainWindow.l ;Hauptfenster
Define Event.l ;Window-Ereignisse
Define MenuEvent.l ;ausgewählter Menüeintrag
Define GadgetList.l ;Gadget-Liste
Define MapScroll.l ;Scrollbereich für die Map
Define MapImage.l ;ID der Map-Grafik
Define NewMapImage.l ;gezoomte Grafik
Define MapImageGadget.l ;Gadget zur Grafikanzeige
Define Factor.l ;Zoomfaktor
Define MenuID.l ;ID für das Menü
Define fl_Quit.l ;Flag für Programmende
Define Filename.s ;Dateiname der Grafik
Define StdPath.s ;Standard-Pfad
Define ImageX.l, ImageY.l
;Menüeinträge
Enumeration 100
#MENU_OPEN
#MENU_END
EndEnumeration
;Zoomfaktoren separat anlegen (gehören aber auch zum Menü)
Enumeration 0 Step 2
#MENU_ZOOMx1 = 1
#MENU_ZOOMx2 = 2
#MENU_ZOOMx4
#MENU_ZOOMx6
#MENU_ZOOMx8
#MENU_ZOOMx10
#MENU_ZOOMx12
#MENU_ZOOMx14
#MENU_ZOOMx16
#MENU_ZOOMx18
#MENU_ZOOMx20
EndEnumeration
;Hauptfenster
#WindowFlags = #PB_Window_ScreenCentered| #PB_Window_SystemMenu| #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget| #PB_Window_SizeGadget
MainWindow = OpenWindow(#PB_Any, 0, 0, 640, 480, "MMM", #WindowFlags)
If MainWindow = 0
End
EndIf
;Menü anlegen
If CreateMenu(MenuID, WindowID(MainWindow))
MenuTitle("Datei")
MenuItem(#MENU_OPEN, "Öffnen...")
MenuBar()
MenuItem(#MENU_END, "Beenden")
MenuTitle("Zoom")
MenuItem(#MENU_ZOOMx1, "Originalgröße")
MenuItem(#MENU_ZOOMx2, "x 2")
MenuItem(#MENU_ZOOMx4, "x 4")
MenuItem(#MENU_ZOOMx6, "x 6")
MenuItem(#MENU_ZOOMx8, "x 8")
MenuItem(#MENU_ZOOMx10, "x 10")
MenuItem(#MENU_ZOOMx12, "x 12")
MenuItem(#MENU_ZOOMx14, "x 14")
MenuItem(#MENU_ZOOMx16, "x 16")
MenuItem(#MENU_ZOOMx18, "x 18")
MenuItem(#MENU_ZOOMx20, "x 20")
EndIf
;unterstützte Bildformate
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
;Hauptschleife
Repeat
Event = WaitWindowEvent()
Select Event
;Menübefehle
Case #PB_Event_Menu
MenuEvent = EventMenu()
Select MenuEvent
Case #MENU_OPEN
Filename = OpenFileRequester("Öffnen", StdPath, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0)
If Filename
StdPath = Filename
;wenn schon eine Grafik geladen war, dann erst mal aufräumen
If MapImage
FreeGadget(MapScroll)
FreeGadget(MapImageGadget)
FreeImage(MapImage)
EndIf
;Bild laden und in die Gadgetliste eintragen
MapImage = LoadImage(#PB_Any, Filename)
ImageX = ImageWidth(MapImage)
ImageY = ImageHeight(MapImage)
If MapImage
CreateGadgetList(WindowID(MainWindow))
MapScroll = ScrollAreaGadget(#PB_Any, 0, 0, WindowWidth(MainWindow), WindowHeight(MainWindow)-MenuHeight(), ImageX, ImageY, 30)
MapImageGadget = ImageGadget(#PB_Any, 0, 0, ImageX, ImageY, ImageID(MapImage))
CloseGadgetList()
EndIf
EndIf
;Zoomfunktion
Case #MENU_ZOOMx1 To #MENU_ZOOMx20
If IsImage(NewMapImage)
FreeImage(NewMapImage)
EndIf
Factor = MenuEvent
NewMapImage = ResizeImage(MapImage, ImageX*Factor, ImageY*Factor, #PB_Image_Raw)
ResizeGadget(MapImageGadget, #PB_Ignore, #PB_Ignore, ImageX*Factor, ImageY*Factor)
SetGadgetState(MapImageGadget, NewMapImage)
SetGadgetAttribute(MapScroll, #PB_ScrollArea_InnerWidth, ImageX*Factor)
SetGadgetAttribute(MapScroll, #PB_ScrollArea_InnerHeight, ImageY*Factor)
Case #MENU_END
fl_Quit = 1
EndSelect
;auf Größenänderungen des Hauptfensters reagieren
Case #PB_Event_SizeWindow
If MapScroll
ResizeGadget(MapScroll, #PB_Ignore, #PB_Ignore, WindowWidth(MainWindow), WindowHeight(MainWindow)-MenuHeight())
EndIf
Case #PB_Event_CloseWindow
fl_Quit = 1
EndSelect
Until fl_Quit = 1
damit das forenfenster nicht so breit gezogen wird.
@All: macht das doch mal bitte von vorne herein.
Kaeru fecit