Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение скриншота, проблемма 
:(
    Опции темы
shedon
Дата 27.9.2004, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Пытаюсь получить скриншот с помощью след. кода
Код

//....
unsigned long nLen = SaveBitmapToFile(CopyScreenToBitmap(), m_pSendBuff+iLen);
//....
HBITMAP CopyScreenToBitmap()
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
int xScrn, yScrn;

hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

hMemDC = CreateCompatibleDC(hScrDC);

nX = 0;
nY = 0;
nX2 = 1024;
nY2 = 768;

xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);

if (nX2 > xScrn)
 nX2 = xScrn;
if (nY2 > yScrn)
 nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;

hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // Выделяет 3мб
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

DeleteDC(hScrDC);
DeleteDC(hMemDC);

return hBitmap;
}
ULONG SaveBitmapToFile(HBITMAP hBitmap, char* pBuff)
{
HDC hDC;
WORD wBitCount;
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;

BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE hDib, hPal, hOldPal=NULL;

hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
wBitCount = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

dwPaletteSize = wBitCount * sizeof(RGBQUAD);

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight;

hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; // Exception !!!

hPal = GetStockObject(DEFAULT_PALETTE);

hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);

GetDIBits(hDC, hBitmap, 0,
 (UINT) Bitmap.bmHeight,
 (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
 (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);

bmfHdr.bfType = 0x4D42; // "MB"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
memcpy(pBuff, &bmfHdr, sizeof(BITMAPFILEHEADER));
pBuff += sizeof(BITMAPFILEHEADER);
memcpy(pBuff, lpbi, dwDIBSize);

GlobalUnlock(hDib);
GlobalFree(hDib);

return (sizeof(BITMAPFILEHEADER)+dwDIBSize);
}


вопервых этот код медленный, как его ускорить, и в нём есть утечка памяити после каждого вызова исчезает 4 метра(!).

Где здесь ошибки ?


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
shedon
Дата 27.9.2004, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Переписал код след. образом, но утечка памяти всёравно продолжается sad.gif
Код

ULONG CServer::GetScreen(char* pBuff)
{
HDC hMemoryDC, hScreenDC;
HBITMAP hBitmap;
BITMAPINFO bmi;
BITMAPINFOHEADER bm;
BITMAPFILEHEADER hdr;
LPBYTE lpBits;
HGDIOBJ hOldBitmap;
unsigned long nLenBuf;

hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);//1mb
hBitmap = CreateCompatibleBitmap(hScreenDC, GetDeviceCaps(hScreenDC, HORZRES), GetDeviceCaps(hScreenDC, VERTRES));
hMemoryDC = CreateCompatibleDC(hScreenDC);
hOldBitmap = SelectObject(hMemoryDC, hBitmap);
BitBlt(hMemoryDC, 0, 0, GetDeviceCaps(hScreenDC, HORZRES), GetDeviceCaps(hScreenDC, VERTRES), hScreenDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemoryDC, hOldBitmap);
bm.biSize = sizeof (BITMAPINFOHEADER);
bm.biWidth = GetDeviceCaps(hMemoryDC, HORZRES);
bm.biHeight = GetDeviceCaps(hMemoryDC, VERTRES);
bm.biPlanes = 1;
bm.biBitCount = GetDeviceCaps(hMemoryDC, BITSPIXEL);
bm.biCompression = BI_RGB;
bm.biSizeImage = 0;
bm.biXPelsPerMeter = 0;
bm.biYPelsPerMeter = 0;
bm.biClrUsed = 0;
bm.biClrImportant = 0;
bmi.bmiHeader = bm;
//    bmi.bmiColors[0] = NULL;
lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, bm.biWidth * bm.biHeight * (bm.biBitCount / 8));

GetDIBits(hMemoryDC, hBitmap, 0, (WORD)bm.biHeight, lpBits, &bmi, DIB_RGB_COLORS);

hdr.bfType = 0x4d42;
hdr.bfSize = (DWORD)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bm.biWidth * bm.biHeight * (bm.biBitCount / 8);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

nLenBuf = (sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(bm.biWidth * bm.biHeight * (bm.biBitCount / 8)));
memcpy(pBuff, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER));
memcpy(pBuff+sizeof(BITMAPFILEHEADER), (LPVOID) &bm, sizeof(BITMAPINFOHEADER));
memcpy(pBuff+sizeof(BITMAPINFOHEADER), (LPVOID) lpBits, bm.biWidth * bm.biHeight * (bm.biBitCount / 8));
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
DeleteObject((HGDIOBJ)(HBITMAP)hBitmap);
DeleteObject(hScreenDC);
GlobalFree(lpBits);

return nLenBuf;
}



--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
shedon
Дата 27.9.2004, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Сейчас вроде этот код заработал, но почему-то цвета через, раз инвертируются....


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Guest
Дата 28.9.2004, 17:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Имитация нажатия PrintScreen:
keybd_event(VK_SNAPSHOT, 0, 0 ,0);
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP,0);
Затем достать из буфера
HANDLE GetClipboardData( UINT uFormat // clipboard format
);


  Вверх
shedon
Дата 28.9.2004, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Нет, такой способ не подходит.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
cardinal
Дата 28.9.2004, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



А bm.biWidth у тебя кратно четырем?

А вообще вот взгляни на один пример на VB, может на какую мыслю толкнет (там правда через Clipboard картинка идет, но это не важно):
http://www.vbnet.ru/faq/showtopic.asp?id=343

Это сообщение отредактировал(а) cardinal - 28.9.2004, 20:24


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
shedon
Дата 29.9.2004, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата(cardinal @ 28.9.2004, 17:11)
А bm.biWidth у тебя кратно четырем?

А это имеет какое-то значение ? там 1024...


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
cardinal
Дата 29.9.2004, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Да, у bmp это имеет большое значение.
Цитата
...
Графические данные в основном представляют собой список пикселей, из которых состоит изображение. Однако каждая горизонтальная строка пикселей должна занимать блок памяти, выровненный по границе параграфа. Следовательно, если количество байт, необходимых для хранения строки пикселей, не кратно четырем, в каждую строку включается от одного до трех дополняющих байт.
...

http://softs.h10.ru/literature.shtml?topic...ok=2&page=5.htm

Но, в данном случае проблема думаю в другом... Пока тоже не понял в чем.

А может у тебя память вообще в соседней процедуре еще выделяется?
Цитата(shedon @ 27.9.2004, 14:22)
Сейчас вроде этот код заработал, но почему-то цвета через, раз инвертируются....

А это вообще прикольно smile.gif


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
shedon
Дата 29.9.2004, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата(cardinal @ 29.9.2004, 05:31)
А может у тебя память вообще в соседней процедуре еще выделяется?

С памятью сейчас проблем нет, цвета инвертируются через раз, если я их отображаю на том же компе что, и получаю скриншот, а так, всё какбы фиолетовым цветом залито. Как быдто палитра меняется


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
cardinal
Дата 29.9.2004, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата(shedon @ 29.9.2004, 08:25)
Как быдто палитра меняется

А ты сравни два файла, чтобы понять что в них на самом деле по разному, только палитра ли?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
shedon
Дата 29.9.2004, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Файлы одинаковые, если скриншот всегда сохранять в файл, то он всегда будет с таким цветом, или смотреть с удал. комп., просто когда я смотрю с локалхоста, похоже когда один скриншот накладывается на другой получается, норм. цвет.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
cardinal
Дата 30.9.2004, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Код
bm.biBitCount = GetDeviceCaps(hMemoryDC, BITSPIXEL);

Чему у тебя в этом месте bm.biBitCount становится равным?

А как насчет того, что ты как bmp файл сохраняешь, всегда одинаковое содержание?

Код
hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

Стопроцентно сказать не могу, но возможно здесь возникает ошибка, потому что иногда (в зависимости от bm.biBitCount) еще бывает палитра, размер которой тоже надо прибавить. Как он высчитывается я забыл, но ради прикола напиши +256.
Код
hdr.bfOffBits = sizeof(BMPINFOHEADER)+sizeof(BMPFILEHEADER)+256;

Вот инфа о палитре:
Цитата
Палитра

Палитра в BMP-файлах хранится в виде списка структур RGBQUAD , где каждый элемент представляет отдельный цвет. Структура RGBQUAD объявляется так:


typedef struct tagRGBQUAD {
BYTE  rgbBlue;
BYTE  rgbGreen;
BYTE  rgbRed;
BYTE  rgbReserved;
} RGBQUAD;

В первых трех полях хранятся цветовые RGB-составляющие. На поле rgbReserved мы не будем обращать внимания (предполагается, что оно равно нулю). Как я упоминал выше, количество структур RGBQUAD в BMP-файле определяется полем biClrUsed . Тем не менее обычно 8-битные BMP-файлы содержат 256 структур RGBQUAD . В 24-битных RGB-файлах структуры RGBQUAD отсутствуют.

http://softs.h10.ru/literature.shtml?topic...ok=2&page=5.htm


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.