Wie kann ich ein Image in GDI + aus einer Base64-codierten Zeichenfolge in C ++ erstellen?

Ich habe eine Anwendung, die derzeit in C # geschrieben ist und eine Base64-codierte Zeichenfolge in ein Image (in diesem Fall ein TIFF-Image) umwandeln kann und umgekehrt. In C # ist das eigentlich ziemlich einfach.

    private byte[] ImageToByteArray(Image img)
    {
        MemoryStream ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
        return ms.ToArray();
    }

    private Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        BinaryWriter bw = new BinaryWriter(ms);
        bw.Write(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true, false);
        return returnImage;
    }

    // Convert Image into string
    byte[] imagebytes = ImageToByteArray(anImage);
    string Base64EncodedStringImage = Convert.ToBase64String(imagebytes);

    // Convert string into Image
    byte[] imagebytes = Convert.FromBase64String(Base64EncodedStringImage);
    Image anImage = byteArrayToImage(imagebytes);

(und jetzt, wo ich es mir anschaue, könnte es noch weiter vereinfacht werden)

Ich habe jetzt ein geschäftliches Bedürfnis, dies in C ++ zu tun. Ich benutze GDI + zum Zeichnen der Grafiken (bisher nur Windows) und habe bereits Code fürdekodiere die Zeichenkette in C ++ (zu einer anderen Zeichenkette). Ich stolpere jedoch darüber, dass ich die Informationen in ein Image-Objekt in GDI + einbaue.

An diesem Punkt denke ich, ich brauche entweder

a) Eine Möglichkeit, diesen Base64-dekodierten String in einen IStream zu konvertieren, um ihn der FromStream-Funktion des Image-Objekts zuzuführen.

b) Eine Möglichkeit, die Base64-codierte Zeichenfolge in einen IStream zu konvertieren, um einen Feed an die FromStream-Funktion des Image-Objekts zu senden (also einen anderen Code als den, den ich derzeit verwende).

c) Auf eine ganz andere Art denke ich hier nicht darüber nach.

Meine C ++ Kenntnisse sindseh rusty und ich bin auch von der verwalteten .NET-Plattform verwöhnt. Wenn ich also alles falsch angreife, bin ich offen für Vorschläge.

AKTUALISIEREN Zusätzlich zu der Lösung, die ich unten gepostet habe, habe ich auch herausgefunden, wie man gehen Sie in die andere Richtung wenn jemand es braucht.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage