2014-10-09 63 views
0

我用Target Machine 64位重新編譯了VS2013 .Net 4中的現有VC++代碼。編譯很好,但由於某些原因SetDIBits不起作用。圖像呈黑色。這些是單色圖像。與VS2008 .Net 2.0 32位編譯相同的精確代碼正常工作。任何想法都會有所幫助。VC++ 64位SetDIBits不起作用

樣品代碼如下(此功能得到IntPtr的手柄,然後將其用於其他圖):

IntPtr GetGraphics(Bitmap ^src, BitmapData ^pData, IntPtr ^phBitmapOldIntPtr) { 

    HDC hdc; 
    IntPtr scan0; 
    BitmapData ^data; 
    System::Drawing::Rectangle rectSrc = System::Drawing::Rectangle(0, 0, src->Width, src->Height); 

    BYTE *pBits; 
    IntPtr pixels, hBitmapIntPtr, hdcIntPtr; 
    BITMAPINFO *pbmi; 
    int iScanLines; 
    int iCopied; 
    HBITMAP hBitmapSrc, hBitmapOld; 

    hdc = CreateCompatibleDC(NULL); 

     hBitmapSrc = CreateCompatibleBitmap(hdc, src->Width, src->Height); 
     data = src->LockBits(rectSrc, ImageLockMode::ReadWrite, src->PixelFormat); 
     pixels = data->Scan0; 
     pBits = (BYTE*)pixels.ToPointer(); 
     //ZeroMemory(&pbmi, sizeof(BITMAPINFO)); 
     pbmi = (BITMAPINFO*)GlobalAlloc(GMEM_FIXED, sizeof(BITMAPINFO) + 2 * sizeof(RGBQUAD)); 
     pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
     pbmi->bmiHeader.biBitCount = 1; 
     pbmi->bmiHeader.biHeight = -src->Height; 
     pbmi->bmiHeader.biWidth = src->Width; 
     pbmi->bmiHeader.biPlanes = 1; 
     pbmi->bmiHeader.biCompression = BI_RGB; 
     pbmi->bmiHeader.biSizeImage = 0; 
     pbmi->bmiHeader.biXPelsPerMeter = 300; 
     pbmi->bmiHeader.biYPelsPerMeter = 300; 
     pbmi->bmiHeader.biClrUsed = 0; 
     pbmi->bmiHeader.biClrImportant = 0; 
     pbmi->bmiColors[0].rgbBlue = 0; 
     pbmi->bmiColors[0].rgbGreen = 0; 
     pbmi->bmiColors[0].rgbRed = 0; 
     pbmi->bmiColors[1].rgbBlue = 255; 
     pbmi->bmiColors[1].rgbGreen = 255; 
     pbmi->bmiColors[1].rgbRed = 255; 
     iScanLines = src->Height; 
     iCopied = SetDIBits(hdc, hBitmapSrc, 0, iScanLines, pBits, pbmi, DIB_RGB_COLORS); 
     GlobalFree(pbmi); 
     if (pData) pData = data; 

    hBitmapOld = (HBITMAP)SelectObject(hdc, hBitmapSrc); 
    phBitmapOldIntPtr = IntPtr(hBitmapOld); 
    hdcIntPtr = IntPtr((void*)hdc); 
    return hdcIntPtr; 
} 

提前感謝!

+0

沒有人應該在64位時代使用'GlobalAlloc'和'GlobalFree',那些功能已經過時了十年。 – 2014-10-09 21:27:37

+0

'hBitmapSrc'似乎命名錯誤。這一切的重點是什麼?你爲什麼不'克隆()'位圖並繪製克隆?未來的繪圖是使用GDI函數而不是.NET繪圖嗎?在這種情況下,我只需從.NET對象中獲取HDC。 – 2014-10-09 21:30:25

+0

這行'if(pData)pData = data;'是無用的,因爲參數是通過複製傳遞的,它的新值立即丟失。 – 2014-10-09 21:32:26

回答

0

整體功能可以被替換爲:

  • src->Clone()位圖複製到兼容的位圖
  • Graphics::FromImage()做出圖形與克隆
  • GetHdc()對顯卡兼容,讓一個HDC爲您現有的繪圖功能
相關問題