2016-12-14 42 views
0

我現在很掙扎,希望有人能幫助我。從SQL數據庫到CImage的圖像

我必須從SQL數據庫中獲取圖像(如使用SQLGetData),並將該數據轉換爲CImage,以便在程序中查看它。

感謝您的幫助!

SQLGetData(m_Hstmt, col, SQL_C_BINARY, BinaryPtr, 0, &cbData) 
+0

歡迎來到Stack Overflow!你可以先參加[遊覽]並學習[問]一個很好的問題,然後創建一個[mcve]。這使我們更容易幫助你。 – Katie

+0

請告訴我們你到目前爲止所嘗試過的。什麼沒有用?另請閱讀並遵循http://stackoverflow.com/help/how-to-ask –

回答

0

的問題可以降低到加載從一個字節數組CImage,因爲這是你從SQLGetData得到什麼。

您沒有指出是否意味着要使用ATL或MFC,但在這兩種情況下都有點尷尬,因爲沒有public :: LoadFromBuffer函數。

這個答案應該做的: https://stackoverflow.com/a/6759701/1132334

它說明了如何創建一個從字節的緩衝區的位圖結構,並從那裏構造的CImage。

如果你需要處理不同的圖片格式,這將是棘手。在這種情況下,將原始字節寫入內存映射文件,然後使用CImage::Load(IStream*)過載。

編輯:所有迄今做過... https://stackoverflow.com/a/14035492/1132334https://stackoverflow.com/a/38710933/1132334

0

感謝所有的答覆。根據@dlatikay的回答,這是我的代碼到目前爲止。但我不知道類型和不知何故我的圖像保持黑色(當我將它保存到文件系統)

繼承人我的代碼到目前爲止。

SQLLEN cbData; 
CImage image; 

BYTE* imgBits; 

    m_Rc = SQLGetData(m_Hstmt, 1, SQL_C_BINARY, imgBits, 0, &cbData); 


    if (SQL_SUCCEEDED(m_Rc)) 
    { 
     width = 317; 
     height = 159; 

     BITMAPINFOHEADER bmInfohdr; 
     // Create the header info 
     bmInfohdr.biSize = sizeof(BITMAPINFOHEADER); 
     bmInfohdr.biWidth = width; 
     bmInfohdr.biHeight = -height; 
     bmInfohdr.biPlanes = 1; 
     bmInfohdr.biBitCount = 8 * 8; 
     bmInfohdr.biCompression = BI_RGB; 
     bmInfohdr.biSizeImage = width*height * 8; 
     bmInfohdr.biXPelsPerMeter = 0; 
     bmInfohdr.biYPelsPerMeter = 0; 
     bmInfohdr.biClrUsed = 0; 
     bmInfohdr.biClrImportant = 0; 

     BITMAPINFO bmInfo; 
     bmInfo.bmiHeader = bmInfohdr; 
     bmInfo.bmiColors[0].rgbBlue = 255; 

     // Allocate some memory and some pointers 
     unsigned char * p24Img = new unsigned char[width*height * 3]; 
     BYTE *pTemp, *ptr; 
     pTemp = (BYTE*)imgBits; 
     ptr = p24Img; 

     // Convert image from RGB to BGR 
     for (DWORD index = 0; index < width*height; index++) 
     { 
      unsigned char r = *(pTemp++); 
      unsigned char g = *(pTemp++); 
      unsigned char b = *(pTemp++); 

      *(ptr++) = b; 
      *(ptr++) = g; 
      *(ptr++) = r; 
     } 

     // Create the CImage 
     image.Create(width, height, 8, NULL); 
     image.Save(_T("c:\\temp\\image1.bmp")); // for testing 
    } 
相關問題