pFile = fopen("c:\\testscan.bmp","wb");
if (!pFile || !___WriteBMPFileHeader(pFile,lImgW,lImgH,scan_param.resolution,scan_param.scan_mode,nBytesPerLine)){
printf("disk file I/O failed!\n");
goto EXIT;
}
/*scan image*/
printf("scanning");
while (lImgLineScaned < lImgH){
printf("...");
/*get one block*/
lImgLinePerBlock = SYSCAN_GetImageBlock(pImgBuf,(short)(LINE_PER_BLOCK <=    (lImgH - lImgLineScaned) ? LINE_PER_BLOCK : (lImgH - lImgLineScaned)),(void*)(&scan_param),lImgW,lImgH);
lImgLineScaned += lImgLinePerBlock;
if (lImgLinePerBlock <= 0){
printf("SYSCAN_GetImageBlock() failed!\n");
goto EXIT;
}
/*write image block data to bmp file*/
if (0 != fseek(pFile,-(lImgLinePerBlock + lImgLineOfLastBlock) * nBytesPerLine,SEEK_CUR)){
printf("disk file I/O failed!\n");
goto EXIT;
}
if ((unsigned int)(nBytesPerLine * lImgLinePerBlock) != fwrite(pImgBuf,1,nBytesPerLine * lImgLinePerBlock,pFile)){
printf("disk file I/O failed!\n");
goto EXIT;
}
lImgLineOfLastBlock = lImgLinePerBlock;
}BOOL ___WriteBMPFileHeader(FILE* pFile,int nImgW,int nImgH,int nDPI,int nColorMode,int nBytesPerLine)
{
BITMAPFILEHEADER   bmpflh;
BITMAPINFOHEADER   bmpifh; bmpflh.bfType = 0x4d42;
bmpflh.bfReserved1 = 0;
bmpflh.bfReserved2 = 0; bmpifh.biSize = sizeof(BITMAPINFOHEADER);
bmpifh.biWidth = nImgW;
bmpifh.biHeight = nImgH;
bmpifh.biPlanes = 1;
if (SCAN_BW_MODE == nColorMode)
bmpifh.biBitCount = 1;
else if(SCAN_GRAY_MODE == nColorMode)
bmpifh.biBitCount = 8;
else if(SCAN_TRUECOLOR_MODE == nColorMode)
bmpifh.biBitCount = 24;
else
return FALSE;
bmpifh.biCompression = BI_RGB;
bmpifh.biSizeImage = 0;
bmpifh.biXPelsPerMeter = nDPI * 10000 / 254;
bmpifh.biYPelsPerMeter = nDPI * 10000 / 254;
bmpifh.biClrUsed = 0;
bmpifh.biClrImportant = 0;

switch (bmpifh.biBitCount){
case 1:
{
RGBQUAD colortable[2];
colortable[0].rgbRed = 0;
colortable[0].rgbGreen = 0;
colortable[0].rgbBlue = 0;
colortable[0].rgbReserved = 0;
colortable[1].rgbRed = 255;
colortable[1].rgbGreen = 255;
colortable[1].rgbBlue = 255;
colortable[1].rgbReserved = 0;
bmpflh.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpifh.biSize + 2 * sizeof(RGBQUAD);
bmpflh.bfSize = bmpflh.bfOffBits + nBytesPerLine * nImgH;
bmpifh.biClrUsed = 2;
bmpifh.biClrImportant = 2;
if (sizeof(BITMAPFILEHEADER) != fwrite(&bmpflh,1,sizeof(BITMAPFILEHEADER),pFile))
return FALSE;
if (bmpifh.biSize != fwrite(&bmpifh,1,bmpifh.biSize,pFile))
return FALSE;
if (sizeof(RGBQUAD) * 2 != fwrite(colortable,1,sizeof(RGBQUAD) * 2,pFile))
return FALSE;
break;
}
case 8:
{
RGBQUAD colortable[256];
for (int i = 0 ; i < 256 ; i ++){
colortable[i].rgbBlue = i;
colortable[i].rgbGreen = i;
colortable[i].rgbRed = i;
colortable[i].rgbReserved = 0;
}
bmpflh.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpifh.biSize + 256 * sizeof(RGBQUAD);
bmpflh.bfSize = bmpflh.bfOffBits + nBytesPerLine * nImgH;
if (sizeof(BITMAPFILEHEADER) != fwrite(&bmpflh,1,sizeof(BITMAPFILEHEADER),pFile))
return FALSE;
if (bmpifh.biSize != fwrite(&bmpifh,1,bmpifh.biSize,pFile))
return FALSE;
if (sizeof(RGBQUAD) * 256 != fwrite(colortable,1,sizeof(RGBQUAD) * 256,pFile))
return FALSE;
break;
}
case 24:
bmpflh.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpifh.biSize;
bmpflh.bfSize = bmpflh.bfOffBits + nBytesPerLine * nImgH;
if (sizeof(BITMAPFILEHEADER) != fwrite(&bmpflh,1,sizeof(BITMAPFILEHEADER),pFile))
return FALSE;
if (bmpifh.biSize != fwrite(&bmpifh,1,bmpifh.biSize,pFile))
return FALSE;
break;
}
//set file length
if (0 != fseek(pFile,bmpflh.bfSize - 1,SEEK_SET))
return FALSE;
if (1 != fwrite(&bmpflh,1,1,pFile))//write any one byte
return FALSE;
if (0 != fseek(pFile,0,SEEK_END))
return FALSE;
return TRUE;
}
不知道那位高手能帮我把这段代码转成VB的,先谢了。

解决方案 »

  1.   

    FILE* pFile = NULL;
    第一行加一句
      

  2.   

    没细看,这个应该能满足你的要求:
    http://61.186.252.131/Expert/TopicView3.asp?id=1538596
      

  3.   

    不是不会,而是太多,是个废力的活啊~~~====================
    免费的学习交流网站,欢迎大家访问!
    http://www.j2soft.cn/
      

  4.   

    你出錢我出力。
    MSN: [email protected]
      

  5.   

    太多了 呵呵 废力阿------------------
    我的个人博客http://spaces.msn.com/members/Drong/
      

  6.   

    有人能告诉我怎么用扫描仪获取图片吗?
    也就是对应的
    BOOL ___WriteBMPFileHeader(FILE* pFile,int nImgW,int nImgH,int nDPI,int nColorMode,int nBytesPerLine)
    这方法在VB中应该怎么写啊?
      

  7.   

    东西太多,不过也不难,大部分是对位图结构(BITMAPINFO、BITMAPINFOHEADER)操作设置位数、DPI、深度等...逐个翻译,慢慢写吧,呵呵。