ResizeImage Frage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

ResizeImage Frage

Beitrag von udg »

Morning,


ich habe ResizeImage schon so oft benutzt aber irgendwie will das nicht funktionieren da ich
nicht mehr so ganz im Bilde zu sein scheine :freak:

Kurzer Code der doch eigentlich ausreichen sollte?

Code: Alles auswählen

 
ContainerGadget(#Cnt_GameCover, WindowWidth(#Main) -310, 30, 300, 300, #PB_Container_BorderLess)
;Ich catche das Bild:
       ImageGadget(#Img_GameCover, 0, 0, 300, 300, CatchImage(#Img_CanvasGameCover, ?Img_CanvasGameCover))
;es soll verkleinert werden, und dann später immer mittig im Container:
      ResizeImage(#Img_CanvasGameCover, 200, 200, #PB_Image_Smooth)
CloseGadgetList()
Das Bild zeigt es nicht an. Nur wenn ich bei Resize auch 300x300 angebe.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: ResizeImage Frage

Beitrag von HeX0R »

Steht in der ResizeImage()-Hilfe
Diese Funktion verändert das Handle des benutzten Bildes. Es muss deshalb z.B. einem ImageGadget() mittels SetGadgetState() neu zugewiesen werden.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: ResizeImage Frage

Beitrag von udg »

Hoi,

danke Dir. Ich habe es dank deines Denkanstoßes wieder gebacken bekommen.


Allgemein:

warum reicht es nicht anzugeben:

- lade aus Memory das Bild in ein Gadget, zb: #Bild
und rufe einfach nur auf:
- ResizeImage(#Bild, 200,200)
?

Warum ist dieser einfache Weg nicht möglich als das ich angeben muss:

Code: Alles auswählen

SetGadgetState(#Img_GameCover,ResizeImage(#Img_CanvasGameCover, 300, 300, #PB_Image_Smooth))
Das könnte man doch stark vereinfachen?

Programmiere ich zB. in C für die PlayStation 1 und möchte eine Grafik in ihrer Größe verändern gebe ich nur an:

tSprite->scalex = tSprite->scaley = ONE; --> fertig ;) oder kleinere Wert / größerer Wert

Grüße und danke noch mal,

Guten Rutsch an Alle... Feiert schön
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: ResizeImage Frage

Beitrag von jacdelad »

Du kannst dir so eine Funktion ratzfatz selbst zusammenklampfen.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
mk-soft
Beiträge: 3852
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ResizeImage Frage

Beitrag von mk-soft »

Bei mehrfach Größenänderung sollte man immer eine Kopie vom Image nehmen.

Code: Alles auswählen

;-TOP

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainImage
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

UsePNGImageDecoder()
UseJPEGImageDecoder()

Procedure UpdateImageGadget(Gadget, Image)
  Protected last_image, dx, dy
  last_image = GetGadgetData(gadget)
  If last_image
    FreeImage(last_image)
  EndIf
  last_image = CopyImage(Image, #PB_Any)
  dx = GadgetWidth(Gadget)
  dy = GadgetHeight(Gadget)
  ResizeImage(last_image, dx, dy)
  SetGadgetState(Gadget, ImageID(last_image))
  SetGadgetData(Gadget, last_image)
EndProcedure

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainImage, 0, 0, dx, dy)
  UpdateImageGadget(#MainImage, 0)
EndProcedure

Procedure Main()
  Protected dx, dy, imagefile.s
  
  imagefile.s = OpenFileRequester("Image", "", "", 0)
  If imagefile
    If Not LoadImage(0, imagefile)
      Debug "Error load image " + imagefile
      End
    EndIf
  Else
    End
  EndIf
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    ImageGadget(#MainImage, 0, 0, dx, dy, 0)
    UpdateImageGadget(#MainImage, 0)
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
  ; Free resources
  If GetGadgetData(0)
    FreeImage(GetGadgetData(0))
  EndIf
  
EndProcedure : Main()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten