Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > GetEncoderClsid - работает не более 85 раз?


Автор: malor 29.6.2011, 17:48
Сохраняю скриншот экрана с периодом полсекунды в JPG-файл. После 85-86 раз скрин уже не создавался - функция 
img->Save(L"Z:\\ImageDesktop.jpeg", &imgClsid, &encoderParams);
возвращала значение 2.
Почему ?
Скрины делал по таймеру с интервалами 0.5 сек, 1 сек, 2 сек.

Код
// http://msdn.microsoft.com/en-us/library/ms533843.aspx
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
}

// Сохраннение в файл на диске в формате JPG
void SaveScreenShotJPG()
{
    static int GoodWork = 0;

    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;
    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(Width, Height);
    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"Z:\\ImageDesktop.jpeg", &imgClsid, &encoderParams);
    if (!status) 
        GoodWork = GoodWork + 1;
    delete bmp;
    delete img;
}


user posted image

P.S. С форматом BMP аналогичная ситуация.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)