[Frage] Wie kann ich CreateImage() in einer DLL verwenden ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

[Frage] Wie kann ich CreateImage() in einer DLL verwenden ?

Beitrag von Mijikai »

Ich habe ein eigenes Bild-Format entwickelt (als Übung) und
den Encoder/Decoder dafür würde ich gerne in eine DLL packen...

Leider funktioniert CreateImage() nicht in einer DLL!
Ich kann kein #Image an das Hauptprogramm übergeben.

Das ist sehr unschön - laut älteren Foren-Einträgen zu diesem Problem ist die Lösung
hierfür den Buffer des Bildes mit EncodeImage() zu übergeben.

Das geht zwar aber schöner wäre es das #Image doch irgendwie zu bekommen (gerne auch mit Win-API).

Gibt es da noch Tricks/ andere Lösungen?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende

Beitrag von ts-soft »

Ohne zu probieren, aber sollte Funktionieren: ImageID(#IMAGE)
Ich hoffe Du weißt was damit gemeint ist, das ImageHandle nutzen und dann per API darstellen!

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende

Beitrag von Mijikai »

Von der Win-API (Bild-technisch) habe ich leider kaum eine Ahnung.

Vielleicht gibt es auch die Möglichkeit auf UsePNGImageDecoder() im Hauptprogramm
verzichten zu können.

Traumziel wäre es so hinzubekommen das man die DLL auch mit anderen Sprachen nutzen kann.
Oder das zumindest alles in der DLL bleibt.

Momentan sieht es so aus:

Code: Alles auswählen

UsePNGImageDecoder()
UsePNGImageEncoder()

Import "nif64.lib"
  NIF_Catch(Buffer.i,BufferSize.i)
  NIF_Load(File.s)
  NIF_Decode(ImageNIF.i);ret = EncodeBuffer!
  NIF_Encode(Source.s,SaveAs.s,Mod.l,Pack.b);ret = ImageNIF oder wahr/falsch wenn ein File (SaveAs not "") erstellt wurde!
  NIF_Size(ImageNIF.i)
  NIF_Width(ImageNIF.i)
  NIF_Height(ImageNIF.i)
  NIF_Free(ImageNIF.i)
  NIF_Version();ret = PtrToStringBuffer!
EndImport

;   Debug NIF_Encode("PureBoardLogo.png","PureBoardLogo",#Null,#True)

NIF = NIF_Load("PureBoardLogo.NIF")
If NIF
  ImageBuffer = NIF_Decode(NIF)
  If ImageBuffer
    Image = CatchImage(#PB_Any,ImageBuffer)
    NIf_Free(ImageBuffer)
  EndIf 
  If Image
    ;SaveImage(image,"PureBoardLogo_NIF.png", #PB_ImagePlugin_PNG )
    If OpenWindow(0,0,0,310,100,"NIF - Image DEMO",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
      If StartDrawing(WindowOutput(0))
        DrawAlphaImage(ImageID(Image),0,0)
        StopDrawing()
      EndIf
      Repeat: Until WaitWindowEvent(5) = #PB_Event_CloseWindow
    EndIf
    FreeImage(Image)
  EndIf
  NIF_Free(NIF)
EndIf
So geschieht die Übergabe des Bildes aus der DLL:

Code: Alles auswählen

      If *NIF\Magic;Was für ein Quellbild war es?
        BufferNIF = EncodeImage(Image,#PB_ImagePlugin_PNG);PNG
      Else
        BufferNIF = EncodeImage(Image);JPG / BMP
      EndIf
      FreeImage(Image)
      ProcedureReturn BufferNIF
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende

Beitrag von GPI »

Vielleicht zum verständnis:
DLL und Hauptprogramm haben eigene Nummernkreise für Gadgets, Images, wasweis ich alles. Sie werden nicht synchronisiert.

Die ImageID(), GadgetID() etc. sind OS-Spezifische "Nummern", die überall gelten. Du kannst also die ImageID() übergeben und diese (in beschränkten Umfang) benutzen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende

Beitrag von Mijikai »

Ich habs jetzt mal mit der ImageID() probiert :)
ein ImagePlugin im Hauptprogramm ist nicht mehr nötig!

So siehts jetzt aus:

Code: Alles auswählen

Import "nif64.lib"
  NIF_Load(File.s)
  NIF_Catch(Buffer.i,BufferSize.i)
  NIF_EncodeFile(File.s,SaveAs.s,Color.l)
  NIF_EncodeBuffer(Buffer.i,BufferSize.i,SaveAs.s,Color.l)
  NIF_Handle(*NIF)
  NIF_Size(*NIF)
  NIF_Width(*NIF)
  NIF_Height(*NIF)
  NIF_Save(*NIF,File.s)
  NIF_Free(*NIF)
  NIF_Version()
EndImport

NIF = NIF_Load("TestImage.NIF")
If NIF
  If OpenWindow(0,0,0,260,260,"NIF - Image DEMO",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    If StartDrawing(WindowOutput(0))
      DrawAlphaImage(NIF_Handle(NIF),0,0)
      StopDrawing()
    EndIf
    Repeat: Until WaitWindowEvent(5) = #PB_Event_CloseWindow
  EndIf
  NIF_Free(NIF)
EndIf

Antworten