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