Как я могу создать Изображение в GDI + от Base64-закодированной строки в C++?

У меня есть приложение, в настоящее время писавшееся в C#, который может взять Base64-закодированную строку и превратить ее в Изображение (изображение в формате TIFF в этом случае), и наоборот. В C# это на самом деле довольно просто.

    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);

(и, теперь, когда я смотрю на него, мог быть упрощен еще больше),

У меня теперь есть бизнес-потребность, чтобы сделать это в C++. Я использую GDI + для рисования графики (Windows только до сих пор), и у меня уже есть код для декодирования строки в C++ (к другой строке). То, что я натыкаюсь на, однако, получает информацию в Объект изображения в GDI +.

В этой точке я полагаю, что мне нужно также

a) Способ преобразовать ту Base64-декодируемую строку в IStream для питания к функции FromStream Объекта изображения

b) Способ преобразовать Base64-закодированную строку в IStream для питания к функции FromStream Объекта изображения (так другой код, чем я в настоящее время использую),

c) Некоторым совершенно другим путем я не думаю здесь.

Мои навыки C++ очень ржавы, и я также испорчен управляемой платформой.NET, поэтому если я нападаю на это неправильно, я открыт для предложений.

ОБНОВЛЕНИЕ: В дополнение к решению я отправил ниже, я также выяснил, как пойти другим путем, если кому-либо нужен он.

5
задан Community 23 May 2017 в 12:23
поделиться

2 ответа

Это должен быть двухэтапный процесс. Во-первых, декодируйте base64 в чистый двоичный файл (биты, которые были бы у вас, если бы вы загрузили TIFF из файла). первый результат Google для этого выглядит довольно неплохо.

Во-вторых, вам нужно преобразовать эти биты в объект Bitmap. Я последовал этому примеру , когда мне пришлось загружать изображения из таблицы ресурсов.

4
ответ дан 13 December 2019 в 05:32
поделиться

OK, используя информацию из связанного мной декодера Base64 и пример, связанный с Беном Штраубом. , У меня все заработало

using namespace Gdiplus; // Using GDI+

Graphics graphics(hdc); // Get this however you get this

std::string encodedImage = "<Your Base64 Encoded String goes here>";

std::string decodedImage = base64_decode(encodedImage); // using the base64 
                                                        // library I linked

DWORD imageSize = decodedImage.length();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
LPVOID pImage = ::GlobalLock(hMem);
memcpy(pImage, decodedImage.c_str(), imageSize);

IStream* pStream = NULL;
::CreateStreamOnHGlobal(hMem, FALSE, &pStream);

Image image(pStream);

graphics.DrawImage(&image, destRect);

pStream->Release();
GlobalUnlock(hMem);
GlobalFree(hMem);

Я уверен, что это можно значительно улучшить, но это работает.

8
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: