У меня есть приложение, в настоящее время писавшееся в 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, поэтому если я нападаю на это неправильно, я открыт для предложений.
ОБНОВЛЕНИЕ: В дополнение к решению я отправил ниже, я также выяснил, как пойти другим путем, если кому-либо нужен он.
Это должен быть двухэтапный процесс. Во-первых, декодируйте base64 в чистый двоичный файл (биты, которые были бы у вас, если бы вы загрузили TIFF из файла). первый результат Google для этого выглядит довольно неплохо.
Во-вторых, вам нужно преобразовать эти биты в объект Bitmap. Я последовал этому примеру , когда мне пришлось загружать изображения из таблицы ресурсов.
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);
Я уверен, что это можно значительно улучшить, но это работает.