Seite 1 von 1

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

Verfasst: 10.09.2017 16:02
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?

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

Verfasst: 10.09.2017 16:52
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

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

Verfasst: 10.09.2017 17:25
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

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

Verfasst: 10.09.2017 17:44
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.

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

Verfasst: 10.09.2017 20:12
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