Очевидное место для использования снимков экрана - реализация команды «Отменить». Простой метод захвата памяти - сделать снимок экрана перед каждым действием. Если пользователь нажимает «Отменить», вы можете восстановить старый экран.
Для экономии места в памяти вы сохраняете только разницу между двумя экранами, XOR их вместе. Само по себе это фактически не сохраняет никакого пространства, но устанавливает все неизмененные пиксели равными 0. Чтобы сэкономить пространство, вам необходимо применить какое-то сжатие. Учитывая, что вы обычно можете ожидать довольно большие области, которые все равны нулю, кодирование длин серий, вероятно, будет быстрым и эффективным. Для кодирования длины серии вы обычно превращаете строку идентичных байтов в два байта, первый из которых содержит длину цикла, а второй - значение. Например, 75 нулей в строке будут закодированы как 75 0
.
Если вы хотите пойти дальше, вместо сохранения растровых изображений XORed, вы можете использовать метафайл. Метафайл записывает действия, предпринятые на уровне вызовов Windows GDI, поэтому (например), если вы нарисовали красный прямоугольник 100x200 в 10, 100, он по сути записал бы, что вместо двадцати тысяч пикселей он сохранит идентификатор, указывающий, какую функцию GDI нужно выполнить, и параметры, предоставляемые этой функции. В типичном случае это может составлять в среднем около 15-20 байт на «выполненную команду». В то же время, это (часто) требует больше вычислений - например, если вы рисуете круг, повторный запуск метафайла требует повторного растеринга круга вместо того, чтобы просто сохранять полученные биты.