Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

проблема с GDI+

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> проблема с GDI+
Имя
Сообщение << Старые топики   Новые топики >>
проблема с GDI+ - 2008-03-22 18:20:05.200000   
vvviperrr

Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
собственно имеется следующий код, который захватывает с экрана HBitmap, создает из него Image и сохраняет картинку в файл:

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

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Немного не то время суток для вникания %). Проверь внимательно на утечку ресурсов. Или попробуй gdi+ инициалайзить вне цикла. Может с освобождением ресурсов проблеммы.
Post #: 2
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> проблема с GDI+







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.