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?
[Frage] Wie kann ich CreateImage() in einer DLL verwenden ?
- 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
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
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.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende
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:
So geschieht die Übergabe des Bildes aus der DLL:
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
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
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.
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!
Re: [Frage] Wie kann ich CreateImage() in einer DLL verwende
Ich habs jetzt mal mit der ImageID() probiert
ein ImagePlugin im Hauptprogramm ist nicht mehr nötig!
So siehts jetzt aus:
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