Seite 1 von 1

jpg Center

Verfasst: 22.12.2018 14:07
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

Re: jpg Center

Verfasst: 22.12.2018 14:13
von NicTheQuick
Wie wäre es mit einem CanvasGadget? Das hat erstens schon mal DoubleBuffering und du kannst da hinzeichnen, wo du willst.

Re: jpg Center

Verfasst: 22.12.2018 14:19
von lite
@Nic

Mit Canvas hab ich noch nie gearbeitet. Ja, warum nicht, nur wie ?

Re: jpg Center

Verfasst: 22.12.2018 14:31
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.

Re: jpg Center

Verfasst: 22.12.2018 15:58
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

Re: jpg Center

Verfasst: 22.12.2018 18:14
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

Re: jpg Center

Verfasst: 29.12.2018 03:11
von udg
Top, die Antwort gilt ;)