Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скриншот из игры, скриншот из игры 
:(
    Опции темы
markus_smile
Дата 21.8.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.8.2007
Где: Москва

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



Всем привет! 

Народ как можно снять изображение c экрана, (или как уже отрендереную сцену прямо в файл) из игры написаной с использованием Directx?
PM MAIL   Вверх
CPlusPlusFAN
Дата 21.8.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Print Screen
PM MAIL ICQ Jabber   Вверх
markus_smile
Дата 22.8.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.8.2007
Где: Москва

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



Цитата(CPlusPlusFAN @ 21.8.2007,  20:44)
Print Screen

Смотри заголовок форума smile  
PM MAIL   Вверх
Solomon
Дата 22.8.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 23.1.2006
Где: Украина Киев

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



Если требуется могу тебе рассказать как это делается на OpenGL там впринципе только одна строчка будет отличатся.. получение данных с буфера экрана... в Директе я незнаю как это сделать


--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
markus_smile
Дата 22.8.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.8.2007
Где: Москва

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



Цитата(Solomon @ 22.8.2007,  14:26)
Если требуется могу тебе рассказать как это делается на OpenGL там впринципе только одна строчка будет отличатся.. получение данных с буфера экрана... в Директе я незнаю как это сделать

Очём речь, напиши конечно. 
PM MAIL   Вверх
Solomon
Дата 22.8.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 23.1.2006
Где: Украина Киев

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



Код

bool TakeScreenshot(char* szFileName, int m_nWidth, int m_nHeight)
{
    QGLImage        Bitmap;
    unsigned char*    ImageData;
    char            szFilename[256];

    CreateDirectory(szFileName, NULL);
    sprintf(szFilename, "%s/screen%i.bmp", szFileName, numScreen);

    ImageData= new unsigned char [m_nWidth*m_nHeight*3];

    glReadPixels(-1, -1, m_nWidth, m_nHeight, GL_RGB, GL_UNSIGNED_BYTE, ImageData);//я вот за эту говорил.. т.е. поиши сотвествующую функцию в директе

    SaveBMP(szFilename, m_nWidth, m_nHeight, ImageData);
    numScreen++;

    delete[] ImageData;
    return true;
}


ну и собственно сохраняем в BMP формат
Data - это указатель на данные нашей картинки
Код

bool QGLImage::SaveBMP(char* szFilename, unsigned int m_nWidth, unsigned int m_nHeight, unsigned char* Data)
{
    FILE*             pFile;
    BITMAPFILEHEADER bitmapFileHeader;
    BITMAPINFOHEADER bitmapInfoHeader;
    unsigned char     TempRGB;
    unsigned int     i;

    pFile = fopen(szFilename, "wb");
    if (!pFile) return false;

    bitmapFileHeader.bfSize                = sizeof(BITMAPFILEHEADER);
    bitmapFileHeader.bfType                = 0x4D42;
    bitmapFileHeader.bfReserved1        = 0;
    bitmapFileHeader.bfReserved2        = 0;
    bitmapFileHeader.bfOffBits            = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    
    bitmapInfoHeader.biSize                = sizeof(BITMAPINFOHEADER);
    bitmapInfoHeader.biPlanes            = 1;
    bitmapInfoHeader.biBitCount            = 24;
    bitmapInfoHeader.biCompression        = BI_RGB;
    bitmapInfoHeader.biSizeImage        = m_nWidth*m_nHeight*3;
    bitmapInfoHeader.biXPelsPerMeter    = 0;
    bitmapInfoHeader.biYPelsPerMeter    = 0;
    bitmapInfoHeader.biClrUsed            = 0;
    bitmapInfoHeader.biClrImportant        = 0;
    bitmapInfoHeader.biWidth            = m_nWidth;
    bitmapInfoHeader.biHeight            = m_nHeight;

    for( i=0; i<bitmapInfoHeader.biSizeImage; i+=3 )
    {
        TempRGB      = Data[i];
        Data[i]   = Data[i+2];
        Data[i+2] = TempRGB;
    }

    fwrite(&bitmapFileHeader, 1, sizeof(BITMAPFILEHEADER), pFile);
    fwrite(&bitmapInfoHeader, 1, sizeof(BITMAPINFOHEADER), pFile);
    fwrite(Data, 1, bitmapInfoHeader.biSizeImage, pFile);

    fclose(pFile);
    return true;
}



--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
ZeroMem
Дата 10.9.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

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



В директе для этого создай Surface и рисуй на нем всю игру. У него есть для скрина метод отдельный просто.
PM MAIL ICQ   Вверх
ull
Дата 9.10.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.10.2007

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



Привет столкнулся с похожей проблемой, но я далёк от DX и OpenGL но так получилось что столкнулся с ними но пока не разобрался что к чему, в общем есть задача: нужно  программно снять скрин с экрана игры, 
Цитата(Solomon @ 22.8.2007,  16:26)
Если требуется могу тебе рассказать как это делается на OpenGL там впринципе только одна строчка будет отличатся.. получение данных с буфера экрана... в Директе я незнаю как это сделать

ты ведешь речь о "буфере экрана" он разве не везде  одинаков, я о DX и OpenGL, я так понимаю буфер экрана это то что в текущий момент отображается на экране и неважно что выводит  изображение... я правильно мыслю ? если так то подобным образом я смогу получить любое изображение в текущий момент... но что-то подсказывает мне что я не прав, не может быть так всё просто, скорее всего вы речь ведете о своих предварительно созданных контекстах, и сних же и снимаете изображение, если не трудно разъясните что и как, а мне нужно сделать прогу которая могла бы с DX игры любой скрины снимать , готовые программные продукты не катят нужно именно своё,  Заранее благодарен за помощь ...
PM MAIL   Вверх
ull
Дата 15.10.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.10.2007

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



Решил я свою проблему, в обход DX стандартным способом через GetDC() и т.д. но проблема остаеётся с DirectShow не поддаётся он, в чём дело не могу понять ...   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

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


 




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


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

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