#define WIDTH 1289
#define HEIGHT 720
using namespace std;
int main(int argc, char* args[])
{
bool quit = false;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* screen = SDL_CreateWindow(“Empty Window”,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
WIDTH, HEIGHT, 0);
if(screen == NULL){
SDL_ShowSimpleMessageBox(0, “Window init error”,
SDL_GetError(),
screen);
}
SDL_Renderer* renderer = SDL_CreateRenderer(screen, -1, 0);
if(renderer == NULL){
SDL_ShowSimpleMessageBox(0, “Renderer init error”,
SDL_GetError(),
screen);
}
SDL_Rect rect;
std::string filename = “ScreenShot.png”;
int bits_per_pixel = 32;
HDC hScreenDC = GetDC(0);
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
int upper_left_x = GetSystemMetrics(SM_XVIRTUALSCREEN);
int upper_left_y = GetSystemMetrics(SM_YVIRTUALSCREEN);
int bitmap_dx = GetSystemMetrics(SM_CXVIRTUALSCREEN ) * 1.25f;
int bitmap_dy = GetSystemMetrics(SM_CYVIRTUALSCREEN ) * 1.25f;
// create file
std::ofstream file(filename.c_str(), std::ios::binary);
if(!file)
quit = true;
// save bitmap file headers
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
fileHeader.bfType = 0x4d42;
fileHeader.bfSize = 0;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);
infoHeader.biSize = sizeof(infoHeader);
infoHeader.biWidth = bitmap_dx;
infoHeader.biHeight = -bitmap_dy;
infoHeader.biPlanes = 1;
infoHeader.biBitCount = bits_per_pixel;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = 0;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biClrUsed = 0;
infoHeader.biClrImportant = 0;
file.write((char*)&fileHeader, sizeof(fileHeader));
file.write((char*)&infoHeader, sizeof(infoHeader));
// dibsection information
BITMAPINFO info;
info.bmiHeader = infoHeader;
// ------------------
// THE IMPORTANT CODE
// ------------------
// create a dibsection and blit the window contents to the bitmap
BYTE* memory = 0;
HBITMAP bitmap = CreateDIBSection(hScreenDC, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0);
SelectObject(hMemoryDC, bitmap);
BitBlt(hMemoryDC, 0, 0, bitmap_dx, bitmap_dy, hScreenDC, upper_left_x, upper_left_y, SRCCOPY);
DeleteDC(hMemoryDC);
ReleaseDC(NULL, hScreenDC);
// save dibsection data
int bytes = (((bits_per_pixel*bitmap_dx + 31) & (~31))/8)*bitmap_dy;
file.write((const char *)memory, bytes);
unsigned char *out_buffer;
size_t out_buffer_len;
// int h, w;
unsigned error;
if ( bits_per_pixel == 24 )
{
// convert memory from bgr format to rgb
for ( unsigned i = 0; i< (unsigned)bytes-2; i+=3)
{
int tmp = memory[i+2];
memory[i+2] = memory[i];
memory[i] = tmp;
}
error = lodepng_encode24(&out_buffer,
&out_buffer_len,
memory,
bitmap_dx,
bitmap_dy);
}
if ( bits_per_pixel == 32 )
{
// convert memory from bgr format to rgb
for ( unsigned i = 0; i< (unsigned)bytes-3; i+=4)
{
int tmp = memory[i+2];
memory[i+2] = memory[i];
memory[i] = tmp;
}
error = lodepng_encode32(&out_buffer,
&out_buffer_len,
memory,
bitmap_dx,
bitmap_dy);
}
if ( error )
{
std::cout << "error: " << error << ‘\n’;
//return;
}
//lodepng_save_file(out_buffer, out_buffer_len, filename.c_str());
// free(out);
DeleteObject(bitmap);
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0xff0000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif // SDL_BYTEORDER
SDL_Surface* image = SDL_CreateRGBSurfaceFrom(out_buffer,
bitmap_dx,
bitmap_dy,
bits_per_pixel,
bytes, rmask, gmask,
bmask, amask);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, image);
SDL_QueryTexture(texture, NULL, NULL, &rect.w, &rect.h);
cout<<"Img w = “<<rect.w<<” Img h = "<<rect.h<<endl;
// 3415 960
/*************************************************
Source
Selecting image data at:
x=1371, y=64
scaled w=1306, h=620
Destination
Show the image at:
x=127, y=81 with the scaled width & height dim
*************************************************/
int dWidth = 1306, dHeight = 620;
int srcX = 1371, srcY = 64;
int dstX = 127, dstY = 81;
SDL_Rect srcRect = {srcX, srcY, dWidth, dHeight};
SDL_Rect dstRect = {dstX, dstY, dWidth, dHeight};
SDL_RenderCopy(renderer, texture, &srcRect, &dstRect);
SDL_RenderPresent(renderer);
/*****************************
Saving the surface to file
*****************************/
string fileName = “shapes.png”;
SDL_Surface* crpSurf = SDL_CreateRGBSurface(image->flags,
dWidth, dHeight,
image->format->BitsPerPixel,
image->format->Rmask,
image->format->Gmask,
image->format->Bmask,
image->format->Amask);
SDL_Rect dRect = {0, 0, dWidth, dHeight};
SDL_BlitSurface(image, &srcRect, crpSurf, &dRect);
IMG_SavePNG(crpSurf, fileName.c_str());
SDL_FreeSurface(crpSurf);
while(!quit){
SDL_WaitEvent(&event);
switch(event.type){
case SDL_QUIT:
quit = true;
break;
}
}
//DeleteObject(bitmap);
SDL_DestroyTexture(texture);
texture = nullptr;
SDL_FreeSurface(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(screen);
SDL_Quit();
return 0;
}