jpg Center

Anfängerfragen zum Programmieren mit PureBasic.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

jpg Center

Beitrag von lite »

Hallo

Wie kann ich eine Bild-Datei zentriert in ein ImageGadget plazieren ?

Es darf kein ResizeGadget verwendet werden um event. das imageGadget zu justieren.

Das definierte ImageGadget hat 200*200.
Wen ich ein Jpg-Datei mit der Größe 100*100 lade wird es in die linke obere Ecke gesetzt.

Für eine Hilfe bin ich Euch sehr dankbar.

Grüße

Lite

Code: Alles auswählen

CompilerIf Defined(GdiplusStartupInput, #PB_Structure) = 0
  Structure GdiplusStartupInput
  GdiPlusVersion.l
  *DebugEventCallback.Debug_Event
  SuppressBackgroundThread.l
  SuppressExternalCodecs.l
  EndStructure
CompilerEndIf
CallFunction(lib, "GdiplusStartup", @*token, @input, #Null) 

Procedure _SetImage(sid,File$)
  
  If FileSize(File$) < 1  : ProcedureReturn: EndIf
  
  ReadFile(0, File$)
  *mempic = AllocateMemory(Lof(0))
 
  ReadData(0, *mempic, Lof(0))
   
   ; gdi plus
    Define  Streammem 
    Protected lib 
    lib = OpenLibrary(#PB_Any, "gdiplus.dll") 
    If lib
      input.GdiplusStartupInput 
      input\GdiPlusVersion = 1 
  
      CallFunction(lib, "GdiplusStartup", @*token, @input, #Null) 
      If *token 
      
        *pmem = GlobalAlloc_(#GHND, MemorySize(*mempic)) 
        *hmem = GlobalLock_(*pmem) 
        CopyMemory(*mempic, *hmem, MemorySize(*mempic)) 
        FreeMemory(*mempic)
        If CreateStreamOnHGlobal_(*hmem, 0, @Streammem) = #S_OK 
          CallFunction(lib, "GdipCreateBitmapFromStream", Streammem , @*image) 

          CallFunction(lib, "GdipGetImageWidth", *image, @width)
          CallFunction(lib, "GdipGetImageHeight", *image, @height)
          ; Debug "Breite: "+width
          ; Debug "höhe: "+height
          CallFunction(lib, "GdipCreateHBITMAPFromBitmap", *image, @imageid, -1)
          CallFunction(lib, "GdipDisposeImage", *image)
          CallFunction(lib, "GdiplusShutdown", *token)
          CloseLibrary(lib)
        EndIf  
          
        If width>0 Or height>0
          img = CreateImage(#PB_Any, width, height, 32,#PB_Image_Transparent )
          StartDrawing(ImageOutput(img))
          If imageid <>0: DrawAlphaImage(imageid,0,0): EndIf
          StopDrawing()
            
	        SetGadgetState(sid,ImageID(img))

	        FreeImage(img)
	      Else  
	        SetGadgetState(sid,0)
          ProcedureReturn 0
        EndIf
      EndIf   
    EndIf

  ProcedureReturn 1
EndProcedure

If OpenWindow(0, 0, 0, 545, 405, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   FrameGadget(0, 9, 9, 202, 202, "", #PB_Frame_Flat)
   ImageGadget(1,  10, 10, 200, 200, 0)                     ; Imagegadget Standard
      
    inpath$ = OpenFileRequester("jpg:", "", "jpg|*.jpg;", 0)
    _SetImage(1,inpath$ )

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: jpg Center

Beitrag von NicTheQuick »

Wie wäre es mit einem CanvasGadget? Das hat erstens schon mal DoubleBuffering und du kannst da hinzeichnen, wo du willst.
Bild
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: jpg Center

Beitrag von lite »

@Nic

Mit Canvas hab ich noch nie gearbeitet. Ja, warum nicht, nur wie ?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: jpg Center

Beitrag von NicTheQuick »

Aufgrund deines bisherigen Codes hatte ich das Gefühl, dass du selbst drauf kommst.

Die Hilfe zum CanvaseGadget() sollte dir schnell helfen können. Im Grunde brauchst du jetzt kein Image mehr und musst das mit SetGadgetState() setzen, sondern du kannst auf das CanvasGadget zeichnen als wäre es ein Image, nämlich mit StartDrawing(CanvasOutput()). Jetzt musst du nur noch aus der Größe des CanvasGadgets und der Größe des darzustellenden Bildes die Koordinaten berechnen, an denen du es auf das CanvasGadget zeichnen musst.
Bild
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: jpg Center

Beitrag von lite »

@Nic

Danke für den Denkanstoß. Hab es hinbekommen.
Es klappt wunderbar auch mit einem ImageGadeget.

Code: Alles auswählen


CompilerIf Defined(GdiplusStartupInput, #PB_Structure) = 0
  Structure GdiplusStartupInput
  GdiPlusVersion.l
  *DebugEventCallback.Debug_Event
  SuppressBackgroundThread.l
  SuppressExternalCodecs.l
  EndStructure
CompilerEndIf
CallFunction(lib, "GdiplusStartup", @*token, @input, #Null) 

Procedure _SetImage(sid,File$)
  
  If FileSize(File$) < 1  : ProcedureReturn: EndIf
  
  ReadFile(0, File$)
  *mempic = AllocateMemory(Lof(0))
 
  ReadData(0, *mempic, Lof(0))
   
   ; gdi plus
    Define  Streammem 
    Protected lib 
    lib = OpenLibrary(#PB_Any, "gdiplus.dll") 
    If lib
      input.GdiplusStartupInput 
      input\GdiPlusVersion = 1 
  
      CallFunction(lib, "GdiplusStartup", @*token, @input, #Null) 
      If *token 
      
        *pmem = GlobalAlloc_(#GHND, MemorySize(*mempic)) 
        *hmem = GlobalLock_(*pmem) 
        CopyMemory(*mempic, *hmem, MemorySize(*mempic)) 
        FreeMemory(*mempic)
        If CreateStreamOnHGlobal_(*hmem, 0, @Streammem) = #S_OK 
          CallFunction(lib, "GdipCreateBitmapFromStream", Streammem , @*image) 

          CallFunction(lib, "GdipGetImageWidth", *image, @width)
          CallFunction(lib, "GdipGetImageHeight", *image, @height)
          ; Debug "Breite: "+width
          ; Debug "höhe: "+height
          CallFunction(lib, "GdipCreateHBITMAPFromBitmap", *image, @imageid, -1)
          CallFunction(lib, "GdipDisposeImage", *image)
          CallFunction(lib, "GdiplusShutdown", *token)
          CloseLibrary(lib)
        EndIf  
          
        If width>0 Or height>0
          tmpx=Int((200-width)/2)	;  center justieren x
	  tmpy=Int((200-height)/2)
          img = CreateImage(#PB_Any, width+tmpx, height+tmpy, 32,#PB_Image_Transparent )
          StartDrawing(ImageOutput(img))
          If imageid <>0: DrawAlphaImage(imageid,tmpx,tmpy): EndIf
          StopDrawing()
          SetGadgetState(sid,ImageID(img))

	        FreeImage(img)
	      Else  
	        SetGadgetState(sid,0)
          ProcedureReturn 0
        EndIf
      EndIf   
    EndIf

  ProcedureReturn 1
EndProcedure

If OpenWindow(0, 0, 0, 545, 405, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   FrameGadget(0, 9, 9, 201, 201, "", #PB_Frame_Flat)
      ImageGadget(1,  10, 10, 200, 200, 0)                     ; Imagegadget Standard
      
      inpath$ = OpenFileRequester("jpg:", "", "jpg|*.jpg;", 0)
      _SetImage(1,inpath$ )
      
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: jpg Center

Beitrag von Bisonte »

den ganzen GDI Kram kann man sich eigentlich auch sparen ;)

Code: Alles auswählen

Procedure Center(Max, Value)
  ProcedureReturn ((Max/2) - (Value/2))
EndProcedure

UseJPEGImageDecoder()
If OpenWindow(0, 0, 0, 545, 405, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(0, $EDEDED)
  FrameGadget(0, 9, 9, 201, 201, "", #PB_Frame_Flat)
  CanvasGadget(1,  10, 10, 200, 200)                     ; Imagegadget Standard
  
  inpath$ = OpenFileRequester("jpg:", "", "jpg|*.jpg;", 0)
  If FileSize(inpath$) > 0
    Image = LoadImage(#PB_Any, inpath$)
    If IsImage(Image)
      
      If StartDrawing(CanvasOutput(1))
        Box(0, 0, OutputWidth(), OutputHeight(), $EDEDED)
        DrawAlphaImage(ImageID(Image), Center(OutputWidth(), ImageWidth(Image)), Center(OutputHeight(), ImageHeight(Image)), 255)
        StopDrawing()
      EndIf
      FreeImage(Image)
    EndIf
  EndIf
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: jpg Center

Beitrag von udg »

Top, die Antwort gilt ;)
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! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten