Tom*_*idd 5 c++ base64 gdi+ tiff image
我有一个应用程序,目前用C#编写,它可以采用Base64编码的字符串并将其转换为Image(在这种情况下为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);
Run Code Online (Sandbox Code Playgroud)
(而且,现在我正在看它,可以进一步简化)
我现在有一个业务需要在C++中这样做.我正在使用GDI +绘制图形(目前只有Windows),我已经有了用C++ 解码字符串的代码(到另一个字符串).然而,我磕磕绊绊的是将信息传递到GDI +中的Image对象.
在这一点上,我想我也需要
a)一种将Base64解码后的字符串转换为IStream以转换为Image对象的FromStream函数的方法
b)一种将Base64编码的字符串转换为IStream以提供给Image对象的FromStream函数的方法(因此,代码与我目前使用的代码不同)
c)我没有想到的一些完全不同的方式.
我的C++技能非常生疏,我也被托管的.NET平台所破坏,所以如果我攻击这一切都错了,我会接受建议.
更新:除了我在下面发布的解决方案之外,如果有人需要,我也会想出如何走另一条道路.
好的,使用我链接的Base64解码器和Ben Straub链接的示例中的信息,我得到了它的工作
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);
Run Code Online (Sandbox Code Playgroud)
我相信它可以大大改善,但它确实有效.
| 归档时间: |
|
| 查看次数: |
6850 次 |
| 最近记录: |