作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个应用程序,目前是用 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)并且我已经有了 decode 的代码C++ 中的字符串(到另一个字符串)。然而,我遇到的问题是将信息获取到 GDI+ 中的 Image 对象中。
在这一点上我想我需要一个
a) 一种将 Base64 解码字符串转换为 IStream 以提供给 Image 对象的 FromStream 函数的方法
b) 一种将 Base64 编码的字符串转换为 IStream 以提供给 Image 对象的 FromStream 函数的方法(因此,与我当前使用的代码不同)
c) 我在这里没有想到的一些完全不同的方式。
我的 C++ 技能非常生疏,而且我也被托管的 .NET 平台宠坏了,所以如果我攻击这一切都是错误的,我愿意接受建议。
更新:除了我在下面发布的解决方案之外,我还想出了如何 go the other way如果有人需要的话。
最佳答案
好的,使用我链接的 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);
我确信它可以得到很大改进,但它确实有效。
关于c++ - 如何从 C++ 中的 Base64 编码字符串在 GDI+ 中创建图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2746855/
我是一名优秀的程序员,十分优秀!