わかりました、全体の話は、私は C++ で Leptonica+Tesseract OCR を使用してスクリーンショットを撮り、それを *.bmp ファイルに保存してから、それを OCR にロードしようとしています。これを頻繁に行う必要はありませんが、スクリーンショット データを直接 Leptonica PIX 構造にコピーできないように見えるため、最初にファイルに保存する必要があります..実際には、これに対する解決策が望ましいでしょう.
これは私がオンラインで見つけたコードで、私を助けようとしています。
スクリーン キャップ:
HBITMAP ScreenCapture(){
int width=100;
int height=100;
// get the device context of the screen
HDC hScreenDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
// and a device context to put it in
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
int x = GetDeviceCaps(hScreenDC, HORZRES);
int y = GetDeviceCaps(hScreenDC, VERTRES);
// maybe worth checking these are positive values
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, x, y);
// get a new bitmap
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemoryDC, hBitmap);
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemoryDC, hOldBitmap);
//GlobalAlloc(GPTR, hBitmap)
WriteDIB(L"test.bmp", (HGLOBAL)hBitmap);
// clean up
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
return hBitmap;
// now your image is held in hBitmap. You can save it or do whatever with it
}
関数を書き込もうとする:
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
{
cout<<endl<<"Running save function";
/*HANDLE hDIB=GlobalAlloc(GPTR, sizeof(hDIBtochange));//this doesn't work, the result is four. Also the HANDLE parameter's name would be changed to hDIBtochange, so that the rest of the function uses the old 'hDIB' throughout
cout<<endl<<sizeof(hDIBtochange);*/
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if (!hDIB)
return FALSE;
CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
// Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize + nColors * sizeof(RGBQUAD));
// Write the file header
file.Write( &hdr, sizeof(hdr) );
// Write the DIB header and the bits
file.Write( lpbi, GlobalSize(hDIB) );
return TRUE;
}
何年にもわたって人々の投稿から恥知らずにコピーされました。Ok!私が直面している問題は、LPBITMAPINFOHEADER で変換または使用できるグローバルにアクセス可能なハンドルに Hbitmap を GlobalAlloc する方法を理解できないようです。lpbi が作成されるとすぐに、Visual Studio 2012 のデバッグで、その中のすべてのフィールドが「メモリを読み取れません」というエラーになります。作成されているにもかかわらず、アクセスできません。
解決策.. メモリ内のスクリーン キャプチャから PIX に直接移動.. ビットマップに保存し、定期的に作成して読み取る方法を見つける.. より理にかなった完全に別の方法を見つける..
最初の方がいいのですが、これで解決策を求めています.2番目または3番目..
さらに情報が必要な場合は、提供を試みることができます。これはほとんどの場合、「このようなコードをこれまでやったことがなく、クラスで教えられていなかったので、勉強しながら学ぼうとしている」ということになります。