使用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行出错
...全文
233 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
这个问题是解决了,但是文件打开后没有图像呀?

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧