Aktuelle Zeit: 23.08.2019 22:29

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: jpg Center
BeitragVerfasst: 22.12.2018 14:07 
Offline

Registriert: 27.08.2012 21:08
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 22.12.2018 14:13 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Wie wäre es mit einem CanvasGadget? Das hat erstens schon mal DoubleBuffering und du kannst da hinzeichnen, wo du willst.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 22.12.2018 14:19 
Offline

Registriert: 27.08.2012 21:08
@Nic

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 22.12.2018 14:31 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 22.12.2018 15:58 
Offline

Registriert: 27.08.2012 21:08
@Nic

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

Code:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 22.12.2018 18:14 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
den ganzen GDI Kram kann man sich eigentlich auch sparen ;)

Code:
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 5.70 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: jpg Center
BeitragVerfasst: 29.12.2018 03:11 
Offline
Benutzeravatar

Registriert: 20.06.2013 23:27
Top, die Antwort gilt ;)

_________________
PureBasic v5.30 + v5.44 LTS + v5.62 | Windows 7 x64 - Gforce GTX 950 - AMD FX6200 Six Core 3.80 | 26GB RAM


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye