13,825
社区成员
发帖
与我相关
我的任务
分享
PBITMAPINFOHEADER pDIB = (PBITMAPINFOHEADER)_DSM_LockMemory(hImg);
if(0 == pDIB)
{
printError(m_pDataSource, "App: Unable to lock memory, transfer failed");
break;
}
// Save the image to disk
FILE *pFile;
fopen("d:\\aa", "wb");
if(pFile == 0)
{
return;
}
else
{
DWORD dwPaletteSize = 0;
switch(pDIB->biBitCount)
{
case 1:
dwPaletteSize = 2;
break;
case 8:
dwPaletteSize = 256;
break;
case 24:
break;
default:
break;
}
// If the driver did not fill in the biSizeImage field, then compute it
// Each scan line of the image is aligned on a DWORD (32bit) boundary
if( pDIB->biSizeImage == 0 )
{
pDIB->biSizeImage = ((((pDIB->biWidth * pDIB->biBitCount) + 31) & ~31) / 8) * pDIB->biHeight;
// If a compression scheme is used the result may infact be larger
// Increase the size to account for this.
if (pDIB->biCompression != 0)
{
pDIB->biSizeImage = (pDIB->biSizeImage * 3) / 2;
}
}
int nImageSize = pDIB->biSizeImage + (sizeof(RGBQUAD)*dwPaletteSize)+sizeof(BITMAPINFOHEADER);
BITMAPFILEHEADER bmpFIH = {0};
bmpFIH.bfType = ( (WORD) ('M' << 8) | 'B');
bmpFIH.bfSize = nImageSize + sizeof(BITMAPFILEHEADER);
bmpFIH.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*dwPaletteSize);
fwrite(&bmpFIH, 1, sizeof(BITMAPFILEHEADER), pFile);//在这行出现错误
fwrite(pDIB, 1, nImageSize, pFile);
fclose(pFile);
pFile = 0;
FILE *pFile = fopen("d:\\aa", "wb");
Graphics::TBitmap *targetBitmap = new Graphics::TBitmap();
LPBITMAPINFO bmi = (LPBITMAPINFO)GlobalLock(hBitmap);
targetBitmap->Height = bmi->bmiHeader.biHeight;
targetBitmap->Width = bmi->bmiHeader.biWidth;
SetDIBits( targetBitmap->Canvas->Handle, targetBitmap->Handle, 0,
(UINT) bmi->bmiHeader.biHeight,
(Byte*)((Byte*)bmi + sizeof(BITMAPINFOHEADER)),
bmi, DIB_RGB_COLORS );
用上面这些代码可以将图片保存出来,但是是彩色的。在扫面的时候要扫面黑白的,所以上面方法就不行了