我从char *
缓冲区中的服务器接收JPEG图像。我想在保存之前在图片框中显示这张图片。我所知道的是一个图片框可以显示来自File,Hbitmap和Stream的图片。我不想使用文件一个。我不知道如何使用其他的。
我已经搜索并尝试了一些,这是我的代码。 我不知道为什么它没有显示任何图片。
delegate void setImagedelegate(Stream ^ image);
void threadDecodeAndShow()
{
while (1)
{
if (f)
{
//the package that is receiving has some custom headers,
// I first find about the size of the JPEG and
//put a pointer at the beginning of the JPEG part.
BYTE *pImgSur = NULL;
DWORD imageInfoLength = *(DWORD*)m_pImgDataBufPtr[nIndexCurBuf];
DWORD customInfoLenForUser = *(DWORD*)(m_pImgDataBufPtr[nIndexCurBuf] + 4 + imageInfoLength);
DWORD jpegLength = *(DWORD*)(m_pImgDataBufPtr[nIndexCurBuf] + 4 + imageInfoLength + 4 + customInfoLenForUser);
pImgSur = (BYTE *)(m_pImgDataBufPtr[nIndexCurBuf] + 12 + customInfoLenForUser + imageInfoLength);
auto store = gcnew array<Byte>(jpegLength);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(pImgSur), store, 0, jpegLength);
auto stream = gcnew System::IO::MemoryStream(store);
this->setImage(stream);
f = 0;
}
}
}
void setImage(Stream ^ image)
{
if (this->pictureBox1->InvokeRequired)
{
setImagedelegate^ d =
gcnew setImagedelegate(this, &MainPage::setImage);
this->Invoke(d, gcnew array<Object^> { image });
}
else
{
this->pictureBox1->Image = Image::FromStream(image);
this->pictureBox1->Show();
}
}
答案 0 :(得分:1)
您可以将char *缓冲区转换为具有内存流的流。两种方法,取决于缓冲区保持有效的时间。 Image类要求流的后备存储在图像的生命周期内保持可读。因此,如果您100%确定可以依赖缓冲区存活足够长时间,那么您可以这样做:
using namespace System;
using namespace System::Drawing;
Image^ BytesToImage(char* buffer, size_t len) {
auto stream = gcnew System::IO::UnmanagedMemoryStream((unsigned char*)buffer, len);
return Image::FromStream(stream);
}
如果您没有这种保证,或者您无法确定,那么您必须复制缓冲内容:
Image^ BytesToImageBuffered(char* buffer, size_t len) {
auto store = gcnew array<Byte>(len);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(buffer), store, 0, len);
auto stream = gcnew System::IO::MemoryStream(store);
return Image::FromStream(stream);
}
垃圾收集器负责销毁流和数组对象,在你处理Image对象后发生,所以不需要帮助。