将char *缓冲区显示为图像

时间:2016-11-23 07:59:11

标签: char c++-cli picturebox

我从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();
        }
    }

1 个答案:

答案 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对象后发生,所以不需要帮助。