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


Автор: markus_smile 21.8.2007, 20:06
Всем привет! 

Народ как можно снять изображение c экрана, (или как уже отрендереную сцену прямо в файл) из игры написаной с использованием Directx?

Автор: CPlusPlusFAN 21.8.2007, 22:44
Print Screen

Автор: markus_smile 22.8.2007, 16:04
Цитата(CPlusPlusFAN @ 21.8.2007,  20:44)
Print Screen

Смотри заголовок форума smile  

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

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

Очём речь, напиши конечно. 

Автор: Solomon 22.8.2007, 17:57
Код

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;
}

Автор: ZeroMem 10.9.2007, 17:35
В директе для этого создай Surface и рисуй на нем всю игру. У него есть для скрина метод отдельный просто.

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

ты ведешь речь о "буфере экрана" он разве не везде  одинаков, я о DX и OpenGL, я так понимаю буфер экрана это то что в текущий момент отображается на экране и неважно что выводит  изображение... я правильно мыслю ? если так то подобным образом я смогу получить любое изображение в текущий момент... но что-то подсказывает мне что я не прав, не может быть так всё просто, скорее всего вы речь ведете о своих предварительно созданных контекстах, и сних же и снимаете изображение, если не трудно разъясните что и как, а мне нужно сделать прогу которая могла бы с DX игры любой скрины снимать , готовые программные продукты не катят нужно именно своё,  Заранее благодарен за помощь ...

Автор: ull 15.10.2007, 09:35
Решил я свою проблему, в обход DX стандартным способом через GetDC() и т.д. но проблема остаеётся с DirectShow не поддаётся он, в чём дело не могу понять ...   smile 

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