2016-11-23 184 views
-1

我從char *緩衝區中的服務器接收到一個JPEG圖像。我想在保存之前在圖片框中顯示此圖片。我知道的是,圖片框可以顯示來自File,Hbitmap和Stream的圖像。我不想使用這個文件。我不知道如何使用其他的。將char *緩衝區顯示爲圖像

我已經搜索並嘗試了一些,這裏是我的代碼。 我不知道爲什麼它不顯示任何圖片。

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

您可以將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); 
} 

垃圾收集器負責銷燬流和對象數組,你處理的圖片對象後會發生,所以沒有必要幫助。

+0

謝謝你的回答,嘗試了很多東西后,你的解決方案沒有錯誤地工作,但它不顯示任何圖像。 – Eoaneh

+0

嗯,這段代碼不應該「顯示任何圖像」,它只是轉換字節。我不可能猜到,你必須提出另一個問題,並正確記錄你對返回的Image對象做了什麼。 –

+0

我編輯了我的帖子並添加了代碼。你可以請看看嗎? – Eoaneh

相關問題