Bearbeiten eines Bitmaps in einer DLL



  • Hallo,

    ich stehe auf dem Schlauch und komme irgenwie nicht weiter.
    In meinem Hauptprogramm (in VB.net) möchte ich eine Bitmap an eine dll (in VC++) übergeben. Die Helligkeitswerte werden dort in ein Array geschoben und weiterverarbeitet. Am Ende werden einige Werte und drei Bilder zurückgegeben.
    In c++ bin ich ein absoluter Anfänger - aber lernwillig 😉

    In VB sähe eine Testroutine etwa so aus

    Public Class Class1
        Public Shared ResultPicture1 As System.Drawing.Bitmap
        Public Shared ResultPicture2 As System.Drawing.Bitmap
        Public Shared Result1 As Integer
    
        Public Shared Function Measure(ByVal InputPicture As System.Drawing.Bitmap) As Integer
            Dim IC As New Drawing.ImageConverter
    
            Dim ByteInputarray() As Byte
            Dim ByteOutputarray() As Byte
            'From Image to Array
            ByteInputArray = CType(IC.ConvertTo(InputPicture, GetType(Byte())), Byte())
            'To Something
            'For testing purposes:
            ByteOutputarray = ByteInputarray
            'Back to Image
            ResultPicture1 = CType(IC.ConvertFrom(ByteOutputarray), Drawing.Image)
            ResultPicture2 = CType(IC.ConvertFrom(ByteOutputarray), Drawing.Image)
            Result1 = 123
        End Function
    End Class
    

    Mein Ansatz war dieser Artikel:
    http://msdn.microsoft.com/de-de/library/ms235636%28v=vs.80%29.aspx
    Es gelang mir aber nicht ein Bitmap anstelle der Double Variable zu übergeben.
    Wie geben ich die Werte und Bitmaps zurück an das Hauptprogramm, bzw. hole diese vom Hauptprogramm aus der dll?
    Kann mit bitte jemand helfen?
    Für jede Hilfe bin ich wirklich Dankbar!!

    Photon



  • es spielt keine rolle ob die funktion in einer dll liegt oder nicht. also das hat nichts mit dem eigentlichen problem zu tun.

    du postest im MFC-Forum, dein beispielcode bezieht sich auf vb.net, du willst c++ programmieren. was denn jetzt genau?
    c++/cli?
    c++ mit mfc?

    welcher typ repräsentiert eine bitmap in dem von dir verwendeten framework? (beachte: sowas wie system.drawing.bitmap gibt es nicht in c++, nur in c++/cli bzw den NET-framework. ist aber auch nicht zu empfehlen)



  • Photon44 schrieb:

    Hallo,
    Es gelang mir aber nicht ein Bitmap anstelle der Double Variable zu übergeben.
    Photon

    du kannst auch nicht die gesammte Bitmap übergeben, sondern nur einen Zeiger auf die Daten, also entweder du lässt die DLL alles machen und übergibst nur den pfad zu Datei und die Dll erzeugt dann eine Zieldatei, alternativ kannst du das sicher auch übern Speicher machen (SharedMemory) oder halt es hat vielleicht noch jemand eine andere Idee dazu, aber das du ein bild was vielleicht 2 MB groß ist über den Stack schaufeln kannst, halte ich für abwegig.
    Wobei du doch sicher den aufbau deiner Birmapstrucktur kennst, also kannst du diese doch als Zeiger an die Dll übergeben, dort zerlegen und bearbeiten und dann den Zeiger auf das Ziel an dein VB Programm zurück geben, oder falls dir der aufbau nicht bekannt ist weil du nur über VB Funktionen zugreifst dann mach dir eine eigene Strucktur und fülle diese mt den entsprechenden Daten und übergib diese an die Dll.

    so meine Gedanken zu deinen Problem.



  • Danke für die Antworten!

    Es sollte entweder ein Projek "Klassenbibliothek" werden oder dll mit MFC.

    Das es die Klassen wie in .net nicht gibt, ist mir klar. Es müsste doch ähnliche Möglichkeiten in C++ geben, oder? Jedenfalls habe ich versucht die CBitmap Klasse zu verwenden - allerdings ohne Erfolg.

    Die Verwednung eines Pointers wäre an dieser Stelle logisch, da das Bild nur im Speicher liegt. Es gibt also keinen Pfad. Nur wie übergebe ich die Zeiger und wie hole ich das Bild von dort ab? (Vermutlich hänge ich hier an den Kleinigkeiten).



  • Photon44 schrieb:

    Das es die Klassen wie in .net nicht gibt, ist mir klar. Es müsste doch ähnliche Möglichkeiten in C++ geben, oder? Jedenfalls habe ich versucht die CBitmap Klasse zu verwenden - allerdings ohne Erfolg.

    Was war ohne Erfolg beim verwenden der Klasse CBitmap? Alternativ kannst du auch die klasse CImage nehmen (gibt es glaub ich ab der version 2002). Aber wenn du eh nur die Helligkeitswerte auslesen willst und diese dann zurück geben willst, stellt sich die frage warum du das erst in ein CBitmap laden willst? Es reicht doch wenn du im Speicher einfach die Daten des Bild Liegen hast und dann über eine Kleine Strucktur die beiden (VB und DLL) bekannt ist. darüber kannst du doch dann alles händeln und den zeiger einfach an die DLL übergeben. Also zumindest klingt das für mich am logischsten.

    Photon44 schrieb:

    Die Verwednung eines Pointers wäre an dieser Stelle logisch, da das Bild nur im Speicher liegt. Es gibt also keinen Pfad. Nur wie übergebe ich die Zeiger und wie hole ich das Bild von dort ab? (Vermutlich hänge ich hier an den Kleinigkeiten).

    Na ja wie du einen Zeiger in VB übergibst (obs das überhaupt gibt) kann ich dir nicht beantworten, da sollteste vielleicht im VB Forum nachfragen, bzw. dort fragen wie man daten zwischen VB und einer DLL austauschen kann, vielleicht gibt es ja noch einen anderen Weg, Filemapping zum Beispiel


Log in to reply