ビデオ内のフレームからサンプルを取得した後、次のc++コードで*.bmpファイルを記述します。
RETVAL Cbmp::WriteBitmapToFile(char *pcFileName,
unsigned char *pucBGRImg,
unsigned short usWidth,
unsigned short usHeight)
{
FILE *fp;
BITMAPINFO bmi;
LONG lStride;
BITMAPFILEHEADER bfi = {0};
LARGE_INTEGER lgbeginning = {0};
if(!pcFileName || !pucBGRImg)
{
return NULL_POINTER;
}
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = ::GetDeviceCaps(::GetDC(NULL),BITSPIXEL);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biWidth = usWidth;
bmi.bmiHeader.biHeight = usHeight;
lStride = ( bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount / 8 + sizeof(DWORD) ) & ~sizeof(DWORD);
bmi.bmiHeader.biSizeImage = lStride * bmi.bmiHeader.biHeight;
bfi.bfSize = sizeof(bfi) + sizeof(BITMAPINFO) + bmi.bmiHeader.biSizeImage;
bfi.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
bfi.bfOffBits = sizeof(bfi) + sizeof(BITMAPINFO);
fp = fopen(pcFileName, "wb");
if (!fp)
{
return CANT_OPEN_PATH;
}
fwrite(&bfi, sizeof(bfi), 1, fp);
fwrite(&bmi, sizeof(BITMAPINFO), 1, fp);
fwrite(pucBGRImg, bmi.bmiHeader.biSizeImage,1, fp);
fclose(fp);
return SUCCESS;
} //end of WriteBitmapToFile
一部のユーザーがMicrosoftリモートデスクトップ(mstsc)を使用しているときに発生するバグを見つけるまで、すべてが非常にうまく機能しました。
ビットマップの保存ボタンを押すと、ファイルは破損して保存され、アルバム画面で表示できなくなります
WinXPマシンから接続しているときにのみ発生することに気づきました
問題の原因がファイルの書き込み方法なのか、それともWin XPのバグなのか、一部の設定によって変更できるのかはわかりません。