vvviperrr
Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
|
собственно имеется следующий код, который захватывает с экрана HBitmap, создает из него Image и сохраняет картинку в файл: Эту функцию взял из Platform SDK
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
Далее сам код:
void GetScreen()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
int Width, Height;
HDC scrdc, memdc;
HBITMAP membit;
scrdc = GetDC(0);
Height = GetSystemMetrics(SM_CYSCREEN);
Width = GetSystemMetrics(SM_CXSCREEN);
memdc = CreateCompatibleDC(scrdc);
membit = CreateCompatibleBitmap(scrdc, Width, Height);
SelectObject(memdc, membit);
BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
Bitmap * bmp = new Bitmap(membit, NULL);
Image * img = bmp->GetThumbnailImage(720, 540);
CLSID imgClsid;
EncoderParameters encoderParams;
int quality = 65;
encoderParams.Count = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = 4;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Value = &quality;
GetEncoderClsid(L"image/jpeg", &imgClsid);
int status;
status = img->Save(L"c:\\123.jpg", &imgClsid, &encoderParams);
delete bmp;
delete img;
GdiplusShutdown(gdiplusToken);
DeleteObject(membit);
ReleaseDC(0, memdc);
ReleaseDC(0, scrdc);
и потом вызываю эту функцию, например так:
For (int i=0; i<200; i++) GetScreen();
Ну хочу я 200 скринов сделать например. А теперь сама проблема. Первые 36 скринов нормально сохраняются, потом метод Save класса Image врзвращает ошибку IvalidParameter. пробовал сохранять в разные файлы - 0 эффекта. убирал третий параметр (который отвечает за сжатие) - 0 эффекта… Значит что то не то с этой микрософтской функцией? Кто знает - отпишитесь :)
|