Захват изображения


Вы можете использовать точечный рисунок, чтобы захватить изображение, сохранить захваченное изображение в памяти, показать его на экране в другом месте окна вашего приложения, или показать его на экране в другом окне.

В некоторых случаях, можете возникнуть необходимость, чтобы ваше приложение захватывало  изображения и сохраняло их только временно. Например, когда Вы масштабируете или увеличивайте (уменьшайте) рисунок, созданный в прикладной программе рисования, приложение должно временно сохранить нормальный вид изображения и показать на экране измененный в масштабе вид. Позже, когда пользователь выбирает нормальный вид, приложение должно заменить масштабированное изображение на копию нормального вида, который оно временно сохранило.

Чтобы временно сохранить изображение, ваше приложение должно вызвать функцию CreateCompatibleDC, чтобы создать контекст устройства (DC), который является совместимым с текущим контекстом устройства окна. После того, как Вы создадите совместимый контекст устройства, создайте точечный рисунок с соответствующими размерами при помощи вызова функции CreateCompatibleBitmap, а затем выберите его в этот контекст устройства при помощи вызова функции SelectObject.

После того, как совместимый контекст устройства будет создан, а соответствующий точечный рисунок выбран в него, Вы можете сделать захват изображения. Функция BitBlt захватывает  изображение. Эта функция выполняет пересылку блока битов  - то есть она копирует данные с исходного точечного рисунка в принимающий точечный рисунок. Однако, эти два параметра функции - не дескрипторы точечного рисунка. Вместо этого, BitBlt  принимает дескрипторы, которые идентифицируют два контекста устройства и копирует растровые данные с точечного рисунка, выбранного в источниковом DC в точечный рисунок, выбранный в целевом DC. В данном случае, целевой DC - совместимый контекст устройства, таким образом когда BitBlt завершает передачу, изображение сохраняется в памяти. Чтобы восстановить на экране изображение, вызовите BitBlt второй раз, устанавливая совместимый контекст устройства как источниковый DC, а контекст устройства окна (или принтера) как целевой DC.

Код примера ниже из приложения, которое захватывает изображение всего рабочего стола, создает совместимый контекст устройства и точечный рисунок с соответствующими размерами, выбирает точечный рисунок в совместимый контекст устройства (DC), а затем копирует изображение, используя функцию BitBlt.

// Создаем обычный DC и DC в памяти для всего экрана. Нормальный DC
// сберегает содержимое "мгновенного снимка" экрана. DC в памяти 
// сохраняет копию этого "мгновенного снимка" в связанном 
// точечном рисунке. 
 
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); 
hdcCompatible = CreateCompatibleDC(hdcScreen); 
 
// Создаем совместимый точечный рисунок для параметра hdcScreen. 
 
hbmScreen = CreateCompatibleBitmap(hdcScreen, 
                     GetDeviceCaps(hdcScreen, HORZRES), 
                     GetDeviceCaps(hdcScreen, VERTRES)); 
 
if (hbmScreen == 0) 
    errhandler("hbmScreen", hwnd); 
 
// Выбираем совместимый точечный рисунок в DC. 
 
if (!SelectObject(hdcCompatible, hbmScreen)) 
    errhandler("Compatible Bitmap Selection", hwnd); 
 
        // Скрываем окно приложения. 
 
        ShowWindow(hwnd, SW_HIDE); 
 
         // Копируем цветовые данные для всего дисплея в точечный  
         // рисунок, который выбирается в совместимый DC. 
 
        if (!BitBlt(hdcCompatible, 
               0,0, 
               bmp.bmWidth, bmp.bmHeight, 
               hdcScreen, 
               0,0, 
               SRCCOPY)) 
 
        errhandler("Screen to Compat Blt Failed", hwnd); 
 
        // Перерисовываем окно приложения. 
 
        ShowWindow(hwnd, SW_SHOW); 

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz