使用twain获得扫描仪的图片问题?

asctwo 2013-07-25 11:11:54
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;


在第58行出错
...全文
136 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ccrun.com 2013-07-25
FILE *pFile; fopen("d:\\aa", "wb"); 改成:
FILE *pFile = fopen("d:\\aa", "wb");
  • 打赏
  • 举报
回复
asctwo 2013-07-25
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 );
用上面这些代码可以将图片保存出来,但是是彩色的。在扫面的时候要扫面黑白的,所以上面方法就不行了
  • 打赏
  • 举报
回复
asctwo 2013-07-25
bmpFIH是文件信息头,pDIB包括位图信息头,调色板以及数据
  • 打赏
  • 举报
回复
ccrun.com 2013-07-25
你这个bmpFIH和pDIB是怎么关联的?我好像木有看到。
  • 打赏
  • 举报
回复
asctwo 2013-07-25
大小是273KB,用系统的画图扫面进来保存也273KB
  • 打赏
  • 举报
回复
ccrun.com 2013-07-25
本来我在1楼的回复只是帮你解决AV的问题,至于有没有图像显示,那要接着排错咯。 先看看写完以后文件大小是多少?
  • 打赏
  • 举报
回复
asctwo 2013-07-25
这个问题是解决了,但是文件打开后没有图像呀?
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2013-07-25 11:11
社区公告
暂无公告