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;
}
提前感謝!
沒有人應該在64位時代使用'GlobalAlloc'和'GlobalFree',那些功能已經過時了十年。 – 2014-10-09 21:27:37
'hBitmapSrc'似乎命名錯誤。這一切的重點是什麼?你爲什麼不'克隆()'位圖並繪製克隆?未來的繪圖是使用GDI函數而不是.NET繪圖嗎?在這種情況下,我只需從.NET對象中獲取HDC。 – 2014-10-09 21:30:25
這行'if(pData)pData = data;'是無用的,因爲參數是通過複製傳遞的,它的新值立即丟失。 – 2014-10-09 21:32:26